首先查看示例代码:
arr = [4, 5, 6]
arr[2] = ["a","b","c"] # First Update
print arr.join(","), ", len=", arr.length, "\n"
print arr[2] ,"\n"
arr[0..1] = [7,"h","b"] # Second Update
print arr.join(","), ", len=", arr.length, "\n"
输出是:
4,5,a,b,c, len=3
abc
7,h,b,a,b,c, len=4
第一次更新时,只有元素2更新为" abc"。但是在第二次更新时,将3个元素更新为2个现有元素会导致插入一个元素,因此数组长度增加1。
我的问题是为什么第一次更新不会导致元素插入?什么是规则?
答案 0 :(得分:2)
不同之处在于你在第二种情况下使用了范围而不是第一种情况。当您在赋值的左侧使用范围作为索引时,Ruby会使用右侧数组中的单个元素替换这些元素。当一个整数用作左侧的索引时,该元素将从右侧替换为整个数组。
如果您在第一次更新时改为arr[2..2] = ['a', 'b', 'c']
,则数组长度将从3变为5(即阵列将变为[4,5,' a&#39} ;,' b',' c'])。
关于此的官方文件位于http://ruby-doc.org/core-2.0/Array.html#method-i-5B-5D-3D
答案 1 :(得分:1)
第一次更新将数组中的一个元素替换为arr
数组,使用p arr
查看:
[4, 5, ["a", "b", "c"]]
第二次更新使用数组替换数组中的两个元素:
[7, "h", "b", ["a", "b", "c"]]
规则是:
答案 2 :(得分:0)
第一次更新后,将第三个元素替换为另一个数组。所以你的数组如下所示:
[4, 5, ["a", "b", "c"]]
这就是为什么结果数组的长度是3。