我刚刚问了一个关于Ruby中循环的问题.这两种迭代集合的方式有区别吗?

# way 1
@collection.each do |item|
  # do whatever
end

# way 2
for item in @collection
  # do whatever
end

只是想知道它们是否完全相同,或者是否存在细微的差异(可能是@collection为零时).

推荐答案

这是唯一的区别:

each:

irb> [1,2,3].each { |x| }
  => [1, 2, 3]
irb> x
NameError: undefined local variable or method `x' for main:Object
    from (irb):2
    from :0

for:

irb> for x in [1,2,3]; end
  => [1, 2, 3]
irb> x
  => 3

对于for循环,迭代器变量在块完成后仍然有效.对于each循环,它不会,除非它在循环开始之前已经被定义为局部变量.

除此之外,for只是each方法的语法糖.

@collectionnil时,两个循环都会引发异常:

异常:未定义的局部变量或main:Object的方法"@collection"

Ruby相关问答推荐

Ruby Case语句和固定,不适用于attr_reader

Ruby:这两种混入模块方法是否等效?

如何在 rspec 中使用 `eq` 匹配器和 `hash_include` 匹配器来获取哈希数组

有没有办法在 Capybara 中保持登录状态?

从 ruby​​ 脚本运行另一个 ruby​​ 脚本

数组到哈希:字数

如何判断 Ruby 文件是否为空?

Ruby:子字符串到一定长度,也到子字符串中的最后一个空格

检测 ruby​​ 是否在 Windows 上运行的正确方法是什么?

Sublime Text 2 中的 RubyTest

如何使用 if..else 块的结果分配变量?

在 Ruby 中将数组转换为索引哈希

为什么 Ruby 使用 respond_to?而不是 responds_to?

RSpec:如何测试文件操作和文件内容

如何删除Ruby中数组中满足条件的所有元素?

在 ruby​​ 的超类中调用另一个方法

相当于 Ruby 中的通过

从 Ruby 中的 URL 获取文件名的好方法是什么?

Ruby:define_method 与 def

如何使用#{variable}在Ruby中格式化带有浮点数的字符串?