я столкнулся с какой-то непредвиденное поведение Руби массивов:Итерация по конкатенированному массиву изменяет элементы в исходных массивах. Зачем?
array1 = ["a"]
array2 = ["b"]
array3 = array1 + array2
puts "array1 before array3.map!: #{array1}"
puts "array2 before array3.map!: #{array2}"
puts "array3 before array3.map!: #{array3}"
array3.map! { |item| item << "_modified" }
puts "array1 after array3.map!: #{array1}"
puts "array2 after array3.map!: #{array2}"
puts "array3 after array3.map!: #{array3}"
Терминальные выходы:
array1 before array3.map!: ["a"]
array2 before array3.map!: ["b"]
array3 before array3.map!: ["a", "b"]
array1 after array3.map!: ["a_modified"] #Unexpected
array2 after array3.map!: ["b_modified"] #Unexpected
array3 after array3.map!: ["a_modified", "b_modified"] #Expected
Первый вопрос: Почему пункты в array1 и массив2 разные, несмотря на только итерация array3? Объединение двух массивов возвращает новый массив, так почему же существуют затяжные эффекты для array1 и array2?
Второй вопрос: Как я могу изменить элементы массива 3 путем итерации без изменения элементов array1 или array2?
Третий вопрос: Когда .map и .each используются вместо .map !, выход идентичен. Таким образом, кажется, что .each и .map меняют элементы в массиве. Почему это происходит?
После определения трех массивов я получил: 'array1.map (&: object_id) # => [70229175091960]; array2.map (&: object_id) # => [70229175065880]; array3.map (&: object_id) # => [70229175091960, 70229175065880] '. Это помогает? –