Ruby中的Enumerable#each和Enumerable#each_entry有区别吗?

时间:2013-11-07 15:39:00

标签: ruby syntax each

Enumerable documentation未明确声明eacheach_entry的别名,但each_entry的描述完全符合我对each的期望

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

有人可以提供一个内置类的示例,例如ArrayHash,其行为与eacheach_entry的行为不同吗?

2 个答案:

答案 0 :(得分:6)

他们是不同的。使用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仅将唯一的块变量传递给每次迭代中传递的第一个对象。

答案 1 :(得分:3)

除了@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)