【问题标题】:Is there a difference between Enumerable#each and Enumerable#each_entry in Ruby?Ruby 中的 Enumerable#each 和 Enumerable#each_entry 之间有区别吗?
【发布时间】:2013-11-19 08:11:49
【问题描述】:

Enumerable documentation 没有明确说明eacheach_entry 的别名,但each_entry 的描述完全符合我对each 的期望。

在两个答案的示例中都定义了新类,它们实现了Enumerable 模块并定义了each 方法。

谁能举一个内置类的例子,比如ArrayHash,它们的行为与eacheach_entry不同?

【问题讨论】:

    标签: ruby syntax each


    【解决方案1】:

    它们是不同的。使用 RDoc 中的示例:

    class Foo
      include Enumerable
      def each
        yield 1
        yield 1, 2
        yield
      end
    end
    
    Foo.new.each_entry{|o| p o}
    # =>
    1
    [1, 2]
    nil
    
    Foo.new.each{|o| p o}
    # =>
    1
    1
    nil
    
    Foo.new.each{|*o| p o}
    # =>
    [1]
    [1, 2]
    []
    

    不同之处在于each_entry 将所有元素传递给唯一的块变量,其行为取决于单次迭代中传递的元素数量:如果没有,则将其视为nil,如果有,则将其视为参数,否则,它将它们放入一个数组中。另一方面,each 只将每次迭代中传递的第一个对象传递给唯一的块变量。

    【讨论】:

    • 哇,谢谢。不过还有一件事:如果each“只接受在每次迭代中传递的第一个对象”,当与 splat 运算符一起使用时,它如何在第三个示例中给出输出?我们可以说 - 为了使 each 不仅接受单次迭代中给出的第一个元素 - 使用 splat 运算符。
    • 更准确地说,它只将第一个对象传递给第一个块变量。编辑了答案。
    【解决方案2】:

    除了@sawa:

    class Alphabet
      include Enumerable
      AZ = ('a'..'z')
      def each
        AZ.each{|char| yield char}
      end
    end
    
    p Alphabet.new.each_entry #<Enumerator: #<Alphabet:0x000000028465c8>:each_entry>
    p Alphabet.new.each       #in `block in each': no block given (yield) (LocalJumpError)
    

    【讨论】:

    • 这是一个更有表现力的答案......喜欢它......很好的研究
    猜你喜欢
    • 2013-04-01
    • 2012-01-25
    • 2013-03-18
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2015-03-04
    相关资源
    最近更新 更多