Rails 中“each .. do”和“for .. in”循环的区别

7

可能是重复问题:
Ruby中的“for”是什么

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

<% for track in @tracks %>

或者

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

你试过了吗?看看会发生什么? - corsiKa
1
请问在 Ruby 中,for 循环的作用是什么? - ghoppe
3个回答

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

新作用域是什么意思? - thenengah
2
@Sam:http://en.wikipedia.org/wiki/Scope_(programming) 请注意,在我的示例中,xz变量可以在for循环后访问,但ay无法在传递给each的块之外访问。 - cam

3

不同之处

大部分情况下,您可能看不出任何区别,但这两种情况是非常不同的。

在一个情况下,您有一个直接在 Ruby 语法中的循环,而在另一个情况下,数据结构遍历会定期地向块产生。

  • return 可能会有所不同。如果外部代码位于 lambda 中,则 return 将从循环内的 lambda 返回,但如果在块内执行,则将从 lambda 外的封闭方法返回。
  • 循环内创建的标识符的词法作用域是不同的。(根据一般原则,您确实不应该在结构化语言特性内创建事物,然后在稍后在外部使用它们,但在 Ruby 中使用循环是可能的,而在块中却不行。)

1

这里没有什么区别,只是语法不同而已。

能够让它变得不同的是向块中添加元素,如计数器或更高级的功能。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接