если я создаю этот массив:модификации двухмерный рубин массив
a = Array.new(3,Array.new(2,0))
он создает:
=> [[0, 0], [0, 0], [0, 0]]
И когда я пытаюсь изменить конкретный элемент:
a[0][0] = 3
он изменяет множественным значения:
=> [[3, 0], [3, 0], [3, 0]]
Почему это происходит? И как я могу изменить определенный элемент?
Это нормально, если значение по умолчанию неизменно, равно как и Fixnum. Если 'a = Array.new (3) {Array.new (2, 'a')}', ('a' является изменяемым) и вы переназначаете элемент,' a [0] [0] = 'b'' , а не проблема: 'a # => [[" b "," a "], [" a "," a "], [" a "," a "]]'. Если, однако, вы * замените * элемент 'a [0] [0] .replace ('b')', вы получите '[[" b "," b "], [" a "," a " ], ["a", "a"]]. (Обязательно сначала повторите инициализацию 'a', если вы хотите проверить это.) Если вы используете' a = Array.new (3) {Array.new (2) {'a'}} ', тогда' a [0] [0] .Надеть ('B'); a # => [["b", "a"], ["a", "a"], ["a", "a"]] ', по желанию. Если вы не уверены, поместите значение по умолчанию в блок. –