Ruby数组更新操作

时间:2013-08-19 05:48:20

标签: ruby arrays

首先查看示例代码:

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。

我的问题是为什么第一次更新不会导致元素插入?什么是规则?

3 个答案:

答案 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"]]

规则是:

  1. 如果与单个整数索引一起使用,则该位置的元素为 被作业右侧的任何内容所取代。
  2. 如果与范围一起使用,则原始数组中的那些元素是 被任务右侧的任何内容所取代。 而且 右侧本身就是一个数组,其元素用于替换。

答案 2 :(得分:0)

第一次更新后,将第三个元素替换为另一个数组。所以你的数组如下所示:

[4, 5, ["a", "b", "c"]]

这就是为什么结果数组的长度是3。