为什么每个方法都需要将循环的值赋给变量?
在Rails上工作,发现我对each
方法的理解缺乏知识。
不确定为什么each
方法都需要变量|message|
在循环访问@messages
,您需要一些方法来引用每个元素以使其可用于您的代码。 Ruby通过将每个元素一次作为变量传递给块来完成此操作。 管道语法在Ruby中用于在任何块上下文中命名块变量,而不仅仅是each
块上下文。
当你在@messages
上迭代时,每个元素应该被称为message
Ruby不会自己决定。 您需要明确地做出该决定并在管道中分配变量名称。 您不需要调用变量message
。 你可以称之为hot_dog
。 但是你需要将元素分配给某个东西 ,否则你将无法访问它以及循环的重点是什么?
<% @messages.each do |hot_dog| %> <%= hot_dog.title %>
<%= link_to "View Message", message_path(hot_dog), class: "btn btn-default" %> <% end %>
不确定为什么每个方法都需要变量
|message|
它不需要它。 你可以很好地省略它。
<% @messages.each do %>
但是,在这种情况下,您要在
输出什么?
each
都不会改变块中的self
与其外部的值。 例如:
class Foo def bar1; "hello"; end def bar2; [1].each { puts bar1 } end Foo.new.bar2 # => "hello"
在此示例中, bar1
方法调用与puts self.bar1
相同,因此您需要在块外部保持相同的self
值。
如果要将块中self
的值设置为当前iteratee,可以使用如下方法:
def bound_each(&blk) each { |x| x.instance_eval &blk } end [1].bound_each { puts self } # => 1
但是据我所知,在Ruby或Rails核心中没有这样的东西。
另请参阅https://stackoverflow.com/a/45556401/2981429以获取类似的方法,该方法将self
绑定到Enumerable( [1]
,此处)