在rails中“each ... do”或“for ... in”循环之间的区别

时间:2011-02-24 23:50:21

标签: ruby-on-rails ruby-on-rails-3 loops

  

可能重复:
  What is “for” in Ruby

嘿。我的问题是,当我遍历数组时,这些循环是否相同。感谢你的时间!

<% for track in @tracks %>

<% @tracks.each do |track| %>

3 个答案:

答案 0 :(得分:9)

它们是不同的(尽管它可能对您的目的无关紧要)。

for不会创建新范围:

blah = %w(foo bar baz)
for x in blah do
   z = x
end
puts z # "baz"
puts x # "baz"

.each为块创建一个新范围:

blah.each { |y| a = y }
puts a # NameError
puts y # NameError

答案 1 :(得分:3)

在大多数情况下,你可能不会看到任何差异,但在这两种情况下情况完全不同。

在一种情况下,您直接使用Ruby语法循环,在另一种情况下,数据结构遍历会定期产生一个块。

  • 返回可能会有所不同。如果外部代码在 lambda 中,则返回将从循环内的lambda返回,但如果在块中执行,它将从lambda外部的封闭方法返回。 / LI>
  • 在循环中创建的标识符的词法范围是不同的。 (根据一般原则,你真的不应该在结构化语言特性中创建东西,然后在外面使用它们,但这可以在Ruby中使用循环而不是块。)

答案 2 :(得分:1)

这里没有区别。只是语法上的差异。

可能会有什么不同之处在于向块添加元素,例如计数器或更高级的功能。

<% @tracks.each do |i, track| -%>
    <% #i is your counter... just and example of adding more information in the block %>
<% end -%>