在Ruby中:
for i in A do
# some code
end
与:
相同A.each do |i|
# some code
end
for
不是内核方法:
for
”究竟是什么类似的东西:
total = sum i in I {x[i]}
映射到:
total = I.sum {|i] x[i]}
答案 0 :(得分:46)
这几乎是语法糖。一个区别是,虽然for
将使用围绕它的代码范围,each
在其块内创建一个单独的范围。比较以下内容:
for i in (1..3)
x = i
end
p x # => 3
与
(1..3).each do |i|
x = i
end
p x # => undefined local variable or method `x' for main:Object
答案 1 :(得分:14)
for
只是each
方法的语法糖。运行此代码可以看出这一点:
for i in 1 do
end
这会导致错误:
NoMethodError: undefined method `each' for 1:Fixnum
答案 2 :(得分:9)
因为只是语法糖。
来自the pickaxe:
For ... In
之前我们曾说过,唯一内置的Ruby循环原语是while和until。那么什么是“为了”的东西呢?好吧,因为几乎是一堆语法糖。当你写
for aSong in songList aSong.play end
Ruby将其转换为:
songList.each do |aSong| aSong.play end
for循环和每个表单之间的唯一区别是正文中定义的局部变量的范围。这将在第87页讨论。
您可以使用for迭代任何响应方法的对象,例如Array或Range。
for i in ['fee', 'fi', 'fo', 'fum'] print i, " " end for i in 1..3 print i, " " end for i in File.open("ordinal").find_all { |l| l =~ /d$/} print i.chomp, " " end
产生
fee fi fo fum 1 2 3 second third
只要你的类定义了合理的每个方法,你就可以使用for循环来遍历它。
class Periods def each yield "Classical" yield "Jazz" yield "Rock" end end periods = Periods.new for genre in periods print genre, " " end
产生
Classical Jazz Rock
Ruby没有列表推导的其他关键字(就像你上面提到的总和例子)。 for
不是非常受欢迎的关键字,通常首选方法语法(arr.each {}
)。