Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么每个方法都要求将其循环的值分配给变量?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on 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 %>

在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 %>
它不需要它。你完全可以省略它

<% @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。