代码之家  ›  专栏  ›  技术社区  ›  David Nehme

Ruby中的“for”是什么

  •  23
  • David Nehme  · 技术社区  · 17 年前

    在Ruby中:

    for i in A do
        # some code
    end
    

    同:

    A.each do |i|
       # some code
    end
    

    for

    • 对于

    比如:

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

    映射到:

     total = I.sum {|i] x[i]}
    
    3 回复  |  直到 14 年前
        1
  •  46
  •   sawa    13 年前

    几乎是糖。一个区别是 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
    
        2
  •  14
  •   the Tin Man    14 年前

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

    for i in 1 do
    end
    

    这将导致以下错误:

    NoMethodError: undefined method `each' for 1:Fixnum
    
        3
  •  9
  •   rampion    17 年前

    因为它只是语法上的糖。

    从…起 the pickaxe :

    对于在里面

    for aSong in songList
      aSong.play
    end
    

    Ruby将其转换为:

    songList.each do |aSong|
      aSong.play
    end
    

    for循环和each表单之间的唯一区别是主体中定义的局部变量的范围。第87页对此进行了讨论。

    您可以使用for来迭代响应每个方法的任何对象,例如数组或范围。

    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
    

    for 不是一个非常流行的关键字,方法语法( arr.each {} )一般来说,这是首选。

    推荐文章