什么是Ruby中的“for”

时间:2008-09-30 22:50:36

标签: ruby metaprogramming

在Ruby中:

for i in A do
    # some code
end

与:

相同
A.each do |i|
   # some code
end

for不是内核方法:

  • ruby​​中的“for”究竟是什么
  • 有没有办法使用其他关键字来做类似的事情?

类似的东西:

 total = sum i in I {x[i]}

映射到:

 total = I.sum {|i] x[i]}

3 个答案:

答案 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 {})。