10

Enumerable 文档没有明确说明它是的each别名each_entry,但它的描述each_entry与我所期望的完全匹配each

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

有人可以举一个内置类的例子,比如Arrayor Hash,它的行为与eachand不同each_entry吗?

4

2 回答 2

11

它们不一样。使用 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另一方面,仅将每次迭代中传递的第一个对象传递给唯一的块变量。

于 2013-11-07T15:45:26.010 回答
5

除了@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-11-07T15:54:07.380 回答