它们是不同的.使用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另一方面,传递给唯一的块变量只传递每次迭代中传递的第一个对象.
除了@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)