1

配列の値を変更するためにcollectメソッドを使用しています。配列の値が変更されることを期待していますが、それは起こりません。以下のコードでは、配列が初期化され、値が1,2,3,4,5に設定されています。これらの値を画面に出力して、変更前の値を示します。

元の配列が画面に出力された後、配列を反復処理し、列挙可能なものの.collectメソッドを使用して値を変更します。

'arr'の値を画面に出力すると(以下のコードの最後の行を参照)、最初の配列とまったく同じ出力が出力されます。つまり、'arr'の値は、collectを使用して配列を反復処理する前後で同じです。最初のプットは[1,2,3,4,5]で、2番目のプットは[2,4,6,8,10]になると思います。

私がここで欠けているものを見ることができますか?

arr = [1,2,3,4,5]

puts arr # outputs 1 2 3 4 5
arr.collect { |x| x * 2 }
puts arr # still outputs 1 2 3 4 5 - not 2 4 5 8 10 as I expect

関連するメモとして、必要に応じてcollect with map(およびmap with collect)を変更できますか、それとも違いがありますか?

よろしくお願いします!

4

1 に答える 1

7

collect( のエイリアスmap) は配列をその場で変更しません。新しい配列を返します。そう:

arr = arr.collect { |x| x * 2}

配列をその場で変更したい場合は、collect!(のエイリアスmap!)を使用します。

arr.collect! { |x| x * 2}

mapと互換性がありcollectます。map!と交換可能ですcollect!

于 2012-10-07T01:05:51.840 に答える