当前位置: 首页 > 知识库问答 >
问题:

迭代连接数组会更改原始数组中的项目。为什么?

微生昌胤
2023-03-14

我在使用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个答案

汝昀
2023-03-14

数组 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”附加到每个项目(不弄乱其标识),然后mapArray3中的每个元素替换为相同的元素。因此,array3 仍然具有与 array1array2 相同的元素,并且其中一个中的任何更改都会反映在另一个中。

 类似资料:
  • 问题内容: 我对map()的行为感到困惑。 我有一个这样的对象数组: 我将此数组传递给应该返回相同数组但所有产品均免费的函数: 函数是: 它返回以下数组: 所以我重写了我的职能是: 它将按预期返回数组。 但是!在那一刻,我放松了主意,在这两种情况下,我都修改了原始产品阵列。 有关map()的文档说不应这样做(https://developer.mozilla.org/en- US/docs/Web

  • 问题内容: 我编写了以下JavaScript: 此代码声明一个变量并将其设置为数组值。然后,它声明第二个变量并将其设置为。它对进行操作,然后向和发出警报。不知何故,当我对执行操作时,似乎对执行了相同的操作。 然后,代码对数字值执行相同的操作:声明一个变量并将其设置为数字值。然后,它声明第二个变量并将其设置为。它对进行操作,然后向和发出警报。在这里,我得到预期的行为:对不同的价值观和。 数组与Jav

  • 考虑: 为什么改变的值会改变的值?

  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 谁能给我解释一下,当我改变从find函数返回的值时,为什么原始数组中的值会改变呢?是不是有一个我缺失的概念?在执行代码之后,我将得到下面提到的输出。

  • 问题内容: 我在变量范围方面遇到麻烦。 我期望输出到,但结果是。为什么我在方法中更改了数组中的值,但是原来的数组却更改了? 问题答案: Java中的数组是一个对象。当您通过创建数组时,它是在堆上创建的,并且返回一个参考值(类似于C中的指针)并将其分配给您的变量。 在C语言中,这表示为: 当您将该变量传递给方法时,您将传递给该方法中的局部(堆栈)变量分配(复制)的参考值。不会复制数组的内容,仅复制参