【发布时间】:2013-11-19 08:11:49
【问题描述】:
Enumerable documentation 没有明确说明each 是each_entry 的别名,但each_entry 的描述完全符合我对each 的期望。
在两个答案的示例中都定义了新类,它们实现了Enumerable 模块并定义了each 方法。
谁能举一个内置类的例子,比如Array或Hash,它们的行为与each和each_entry不同?
【问题讨论】:
Enumerable documentation 没有明确说明each 是each_entry 的别名,但each_entry 的描述完全符合我对each 的期望。
在两个答案的示例中都定义了新类,它们实现了Enumerable 模块并定义了each 方法。
谁能举一个内置类的例子,比如Array或Hash,它们的行为与each和each_entry不同?
【问题讨论】:
它们是不同的。使用 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 只将每次迭代中传递的第一个对象传递给唯一的块变量。
【讨论】:
each“只接受在每次迭代中传递的第一个对象”,当与 splat 运算符一起使用时,它如何在第三个示例中给出输出?我们可以说 - 为了使 each 不仅接受单次迭代中给出的第一个元素 - 使用 splat 运算符。
除了@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)
【讨论】: