【发布时间】:2015-06-06 23:31:38
【问题描述】:
我在使用 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 有挥之不去的影响呢?
第二个问题:如何在不改变array1或array2的项目的情况下,通过迭代改变array3中的项目?
第三个问题:当使用 .map 和 .each 代替 .map! 时,输出是相同的。所以看起来 .each 和 .map 正在改变数组中的项目。为什么会出现这种情况?
【问题讨论】:
-
定义三个数组后得到:
array1.map(&:object_id) #=> [70229175091960]; array2.map(&:object_id) #=> [70229175065880]; array3.map(&:object_id) #=> [70229175091960, 70229175065880]。这有帮助吗?
标签: ruby arrays loops concatenation concat