我在使用Ruby数组时遇到了一些意外的行为:
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和array2中的项目不同,尽管只在array3上迭代?连接两个数组会返回一个新数组,那么为什么array1和array2会有延迟效应呢?
第二个问题:如何通过迭代来更改array3中的项目,而不更改项目array1或array2?
第三个问题:当使用. map和. each代替. map!时,输出是相同的。所以. each和. map似乎正在更改数组中的项目。为什么会发生这种情况?
数组 1
和阵列 2
不会被修改。修改字符串“a”
和“b”。
这么看吧:
string = "a"
array = [string, string, string] # ["a", "a", "a"]
string << "b"
array # ["ab", "ab", "ab"]
阵列未更改。它仍然是[字符串,字符串,字符串]。
但字符串
不同。
编辑 为了澄清,并从注释中重复,您没有修改数组。这是修改数组:
array3.each_index { |index| array3[index] = item + "_modified" }
当你用一个元素替换另一个元素时。当您执行这个命令时,< code>array1和< code>array2不变地打印——它们的元素被从< code>array3中踢出,并被其他元素替换。你做了什么:
array3.map! { |item| item << "_modified" }
将“_modifier”
附加到每个项目(不弄乱其标识),然后map!
将Array3
中的每个元素替换为相同的元素。因此,array3
仍然具有与 array1
和 array2
相同的元素,并且其中一个中的任何更改都会反映在另一个中。