23

在红宝石中:

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]}
4

3 回答 3

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
于 2008-09-30T23:15:49.217 回答
14

for只是该each方法的语法糖。这可以通过运行以下代码看到:

for i in 1 do
end

这会导致错误:

NoMethodError: undefined method `each' for 1:Fixnum
于 2008-09-30T23:04:56.217 回答
9

For 只是语法糖。

对于...在

前面我们说过,唯一内置的 Ruby 循环原语是 while 和 until。那么,这个“为”的东西是什么?好吧, for 几乎是一大堆语法糖。当你写

for aSong in songList
  aSong.play
end

Ruby 将其翻译成如下内容:

songList.each do |aSong|
  aSong.play
end

for 循环和 each 形式之间的唯一区别是在主体中定义的局部变量的范围。第 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

只要你的类定义了一个明智的 each 方法,你就可以使用 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 没有其他用于列表推导的关键字(如您上面所做的 sum 示例)。 for不是一个非常流行的关键字,arr.each {}通常首选方法语法 ( )。

于 2008-09-30T23:11:04.550 回答