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

Ale*_*pov 7 ruby syntax each

可枚举文件没有明确说明这each是一个别名each_entry,但在描述each_entry比赛正是我所期待的each.

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

有人可以给出一个内置类的例子,比如Array或者Hash,它的行为方式与each和不同each_entry

saw*_*awa 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]
[]
Run Code Online (Sandbox Code Playgroud)

不同之处在于,each_entry根据单次迭代中传递的元素数量,通过不同的行为将所有元素传递给唯一的块变量:如果没有,则将其视为nil,如果是,则采用该参数,否则,将它们放入阵列.each另一方面,传递给唯一的块变量只传递每次迭代中传递的第一个对象.


ste*_*lag 6

除了@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)
Run Code Online (Sandbox Code Playgroud)