有一个数组
a = 1, 2, 3, 4
和一个枚举器:
e = a.map!
然后,通过重复调用 e.next
,数组 a 被很好地销毁:
e.next #=> 1
a #=> [1, 2, 3, 4]
e.next #=> 2
a #=> [nil, 2, 3, 4]
e.next #=> 3
a #=> [nil, nil, 3, 4]
太搞笑了!但是当我尝试
e.next { |x| 2 * x } # => 4
我明白了
a #=> [nil, nil, nil, 4]
而不是想要的
a #=> [nil, nil, nil, 8]
我误会了什么?如何让 a.map!
对元素做我想做的事?
我的问题是,我并不完全理解枚举器。例如,使用前面的代码,枚举器 e
构成了 a
的后门:
e.each { 42 }
a #=> [42, 42, 42, 42]
我想知道,如何使用 nil 以外的值逐渐做到这一点。 (我可以多次使用 e.rewind
和 e.next
逐渐用 nils 填充它,如我之前所示。
要使 map!
的行为如您所愿,您需要 Enumerator#feed
方法,请考虑这一点
ary = *1..4
enum = ary.map!
# the `loop` method handles `StopIteration` for us
loop do
x = enum.next
enum.feed(x * 2)
end
ary
# => [2, 4, 6, 8]
我是一名优秀的程序员,十分优秀!