为什么每个方法都需要将循环的值赋给变量?

在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] ,此处)