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ď č. 1To 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]