中 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]