/ / 2次元配列のマップと各動作 - ルビ、多次元配列

マップとそれぞれの2次元配列の振る舞い - ルビー、多次元配列

each 2次元配列内の指定された行の値は変更されません( map):

test_array = [[0,0],[0,0],[0,0]]

test_array[0].each {|e| e = 1}
test_array # => [[0, 0], [0, 0], [0, 0]]

test_array[0].map! {|e| e = 1}
test_array # => [[1, 1], [0, 0], [0, 0]]

each 指定された列の値を変更します( map):

test_array = [[0,0],[0,0],[0,0]]

test_array.each {|row| row[0] = 2}
test_array # => [[2, 0], [2, 0], [2, 0]]

test_array.map! {|row| row[0] = 2}
test_array # => [2, 2, 2]

誰かが何が起こっているのか説明できますか?

回答:

回答№1の場合は3

これは、Rubyでは、パラメータが「オブジェクト参照によって渡される」ためです。

以下のケースでは、

test_array.each {|row| row[0] = 2}

row 内部の配列を指します test_array、その内容を変更すると test_array。これは、現在存在するサブ配列を突然変異させる test_array.

以下のケースでは、

test_array[0].each {|e| e = 1}

e の整数を意味 array[0]、異なる整数を指すようにすることは、現在の整数値に変更を加えていないので、元の値に影響を与えません array[0].

詳細はこちら: Rubyは参照渡しか値渡しですか?

あなたの質問について map、あなたが使用していることに注意してください map!これはメソッドが呼び出されたオブジェクトを変更しますが、 map 値を返します。

map! {|item| block } → ary

指定されたブロックを各要素に対して1回呼び出します。 selfその要素をブロックが返す値に置き換えます。

出力 map そのまま返されます:

test_array.map {|row| row[0] = 2}
test_array # => [[2, 0], [2, 0], [2, 0]]

test_array は、 map

test_array.map! {|row| row[0] = 2}
test_array # => [2, 2, 2]