/ / Správanie mapy a každá pre 2D matice - rubínové, multidimenzionálne pole

Správanie mapy a každá pre 2D matice - rubínové, multidimenzionálne pole

zatiaľ čo each nemení hodnoty daného riadku v poli 2d (na rozdiel od 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 zmení hodnoty daného stĺpca (inak ako 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]

Môže niekto vysvetliť, čo sa deje?

odpovede:

3 pre odpoveď č. 1

To je preto, že v Ruby sú parametre "odovzdané referenciou objektu".

V nižšie uvedenom prípade,

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

row označuje pole vnútri test_array, a úprava jeho obsahu bude odrážať test_array, Toto mutuje podradné pole v súbore test_array.

V nižšie uvedenom prípade,

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

e znamená celé číslo v array[0], a poukázať na odlišné celé číslo nebude mať vplyv na pôvodnú hodnotu, pretože nezmeníme celočíselné hodnoty prítomné v array[0].

Viac informácií tu: Je Ruby prechádza odkazom alebo hodnotou?

Čo sa týka vášho dotazu map, prosím, berte na vedomie, že používate map!, ktorý zmení objekt, na ktorom sa nazýva metóda, zatiaľ čo map vráti hodnotu.

map! {|item| block } → ary

Vyvolá daný blok raz pre každý prvok self, pričom nahradí element s hodnotou vrátenou blokom.

Výstup z map sa vráti ako je:

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

test_array sa nahrádza výstupom map:

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