Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 迭代连接的数组会改变原始数组中的项。为什么?_Ruby_Arrays_Loops_Concatenation_Concat - Fatal编程技术网

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

Ruby 迭代连接的数组会改变原始数组中的项。为什么?,ruby,arrays,loops,concatenation,concat,Ruby,Arrays,Loops,Concatenation,Concat,我在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 << "_mod

我在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和array2中的项不同,尽管只在array3上迭代?连接两个数组将返回一个新数组,那么为什么会对array1和array2产生延迟效果呢

第二个问题:如何通过迭代更改array3中的项,而不更改array1或array2中的项


第三个问题:When.map和.When分别用来代替.map!,输出是相同的。因此,似乎.each和.map正在更改数组中的项。为什么会出现这种情况?

array1
array2
不会被修改。字符串
“a”
“b”
被修改

这样看:

string = "a"
array = [string, string, string] # ["a", "a", "a"]
string << "b"
array # ["ab", "ab", "ab"]
用另一个元素替换每个元素时。执行此操作时,
array1
array2
打印不变-它们的元素将从
array3
中踢出,并被其他元素替换。你所做的:

array3.map! { |item| item << "_modified" }

array3.map!{| item | item我认为修改数组中的一个项目正是修改数组的意思。好吧,假设你有一个有3个娃娃的洋娃娃屋。你把其中一个娃娃浸在蓝色油漆中。洋娃娃屋被修改了吗?它仍然有以前的3个娃娃。当然,它看起来不一样(就像
array1
打印出来时看起来不一样),但它的内容与以前相同。让array=[1,2,3]。如果array.map!{| val | i*2},那么它说从现在起数组已经被修改了,数组是[2,4,6]Welp,现在你进入了一个完全不同的领域,因为数字是不可变的,而字符串是可变的。“修改数组”意味着添加、删除或替换元素,
item我刚才看到你的评论被编辑了。事实上,
array.map!{| val | I*2}
将修改数组:
i*2
创建一个不同于
2
的新数字
4
(与无法将
2
修改为
4
相反),然后用新值替换数组元素。在您的情况下,关键问题是用相同的对象替换元素(你在上面做了一个驱动器切割),所以数组保持不变。在定义了三个数组之后,一定要看到它们之间的区别:
array1.map(&:object_-id)#=>[7022917591960];array2.map(&:object_-id)=>[7022917565880];array3.map(&:object_-id)<>?
array3.each_index { |index| array3[index] = item + "_modified" }
array3.map! { |item| item << "_modified" }