什么是Ruby中的“for”

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

这几乎是语法糖。 一个区别是,虽然for会使用围绕它的代码范围,但each代码都在其块中创建一个单独的范围。 比较以下内容:

 for i in (1..3) x = i end px # => 3 

 (1..3).each do |i| x = i end px # => undefined local variable or method `x' for main:Object 

for只是each方法的语法糖。 运行此代码可以看出这一点:

 for i in 1 do end 

这会导致错误:

 NoMethodError: undefined method `each' for 1:Fixnum 

因为只是语法糖。

从镐 :

因为… 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 {} )。