1

配列を持つ

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!要素で私がやりたいことをする方法は?

私の問題は、列挙子を完全に理解していないことです。たとえば、前のコードを配置すると、enumeratoreは へのバックドアを構成しaます。

e.each { 42 }
a #=> [42, 42, 42, 42]

nil以外の値を使用して、これを徐々に行う方法を知りたいです。e.rewind(前に示したように、 and をe.next数回使用して、徐々に nil で埋めることができます。

4

3 に答える 3

3

必要に応じて動作させる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]
于 2013-06-13T08:34:27.627 に答える