Enumerable documentation未明确声明each
是each_entry
的别名,但each_entry
的描述完全符合我对each
的期望
在两个答案的示例中,定义了新类,它们实现Enumerable
模块并定义each
方法。
有人可以提供一个内置类的示例,例如Array
或Hash
,其行为与each
和each_entry
的行为不同吗?
答案 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)