我试着看看 Array#[]=
是如何工作的,并尝试了一下:
enum[int] = obj → obj
enum[start, length] = obj → obj
enum[range] = obj → obj
问题一
我有一个数组 b
在其 0
索引处包含 nil
。
b = []
b[0] # => nil
我试图在下面的代码中用整数 10
替换 nil
。
b[-1] = 10 # => IndexError: index -1 too small for array; minimum: 0
为什么上面的代码不起作用,而下面的代码却起作用了?对于大小为 1
的数组,为什么索引 0
和 -1
的处理方式不同?
b[0] = 5 # => 5
b[-1] = 10 # => 10
问题二
我创建了一个大小为 2
的数组,并执行了以下操作:
a = [1,2]
a[-3] = 3 # => IndexError: index -3 too small for array; minimum: -2
a[-3] = [3] # => IndexError: index -3 too small for array; minimum: -2
a[-3..-4] = [3] # => RangeError: -3..-4 out of range
我相信负索引永远不会增加数组的大小,但我不知道为什么。为什么下面的代码成功了?
a[-2..-3] = [3,4] #=> [3, 4]
最佳答案
我建议您看一下 Array documentation 中的第一段.令人惊讶的是:“假定负索引是相对于数组末尾的——也就是说,索引 -1 表示数组的最后一个元素,-2 是数组中倒数第二个元素,等等上。”
这意味着,您可以设置 a[-N]
第一个元素当且仅当 |N| <= a.size
.这就是为什么 a = [1,2] ; a[-3] = 3
失败 (3 > 2)。
另一方面,ruby 数组有[可能] 未记录的功能:a[INBOUNDS_IDX..NONSENSE_IDX]=SMTH
将插入 SMTH
之前 INBOUNDS_IDX
索引:
a=[1,2]
a[2..0]='a'
a[2..1]='b'
a[2..-100]='c'
# ⇒ [1, 2, "c", "b", "a"]
a[2..-1]='q'
# ⇒ [1, 2, "q"]
这里废话的意思是“小于 INBOUNDS_IDX,and 不能被视为负数中的索引”(这就是为什么上例中的 a[2..-1]
被视为 a[2..(a.size - 1)]
的原因。)
关于ruby - 负索引如何与 `Array#[]=` 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049744/