Ruby on rails 为什么每个方法都要求将其循环的值分配给变量?
在Rails上工作,发现我对Ruby on rails 为什么每个方法都要求将其循环的值分配给变量?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在Rails上工作,发现我对每种方法的理解都缺乏知识 不确定为什么每个方法都需要变量| message <% @messages.each do |message| %> <h2><%= message.title %></h2> <%= link_to "View Message", message_path(message), class: "btn btn-default" %> <% end %>
每种方法的理解都缺乏知识
不确定为什么每个
方法都需要变量| message
<% @messages.each do |message| %>
<h2><%= message.title %></h2>
<%= link_to "View Message", message_path(message), class: "btn btn-default" %>
<% end %>
不确定为什么每个方法都需要变量| message
<% @messages.each do |message| %>
<h2><%= message.title %></h2>
<%= link_to "View Message", message_path(message), class: "btn btn-default" %>
<% end %>
它不需要它。你完全可以省略它
<% @messages.each do %>
但是,在这种情况下,您将在
中输出什么?当您在@消息中循环时,您需要某种方法来引用每个元素,以使其对代码可用。Ruby通过将每个元素作为变量一次传递给块来实现这一点。在Ruby中,管道语法用于在任何块上下文中命名块变量,而不仅仅是每个
Ruby不会自行决定在迭代@messages
时,每个元素都应该被称为message
。您需要明确地做出决定,并在管道中指定变量名。您不需要调用变量消息
。你可以叫它热狗。但是您需要将元素分配给某个对象,否则您将无法访问它,循环的意义是什么
<% @messages.each do |hot_dog| %>
<h2><%= hot_dog.title %></h2>
<%= link_to "View Message", message_path(hot_dog), class: "btn btn-default" %>
<% end %>
每个
都不会改变块内与块外的self
值。例如:
class Foo
def bar1; "hello"; end
def bar2; [1].each { puts bar1 }
end
Foo.new.bar2 # => "hello"
在本例中,bar1
方法调用与说put self.bar1
相同,因此需要将self
的值保持在块外
如果要将块中的self
值设置为当前迭代对象,可以使用如下方法:
def bound_each(&blk)
each { |x| x.instance_eval &blk }
end
[1].bound_each { puts self } # => 1
然而,据我所知,Ruby或Rails内核中没有类似的东西
另请参见类似的方法,该方法将self
绑定到可枚举项([1]
,此处)称为迭代。这就像在ruby中编写任何循环一样。在没有变量的情况下,您如何引用当前元素?有一些(有些复杂)情况是,如果您知道有一个参数,您可以不定义它而不受影响#1表示如果参数是块,则可以使用yield
调用块,而不是为其定义变量#2您可以使用&:something
,但这些代码实际上不是作为块编码的,即使它们编译成块。总之,尽管你的帖子完全回答了这个问题+1。