0

先看示例代码:

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。

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

4

3 回答 3

2

不同之处在于您在第二种情况而不是第一种情况下使用了范围。当您使用范围作为赋值左侧的索引时,Ruby 将这些元素替换为右侧数组中的各个元素。当整数用作左侧的索引时,该元素将替换为右侧的整个数组。

如果您arr[2..2] = ['a', 'b', 'c']在第一次更新时说,数组长度将从 3 变为 5(即数组将变为 [4, 5, 'a', 'b', 'c'])。

官方文档位于http://ruby-doc.org/core-2.0/Array.html#method-i-5B-5D-3D

于 2013-08-19T06:03:11.993 回答
1

第一次更新将数组中的一个元素替换为一个数组 to arr,用于p arr签出:

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

第二次更新将数组中的两个元素替换为一个数组:

[7, "h", "b", ["a", "b", "c"]]

规则是:

  1. 如果与单个整数索引一起使用,则该位置的元素将替换为赋值右侧的任何元素。
  2. 如果与范围一起使用,则原始数组中的那些元素将替换为赋值右侧的任何元素。而右边本身就是一个数组,它的元素用于替换。
于 2013-08-19T06:04:07.363 回答
0

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

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

这就是结果数组的长度为 3 的原因。

于 2013-08-19T05:55:40.327 回答