我有一个简单的数组对象:
array = [:peanut, :butter, :and, :jelly]
它的长度显然是 4!
现在,看看这些陈述:
array[4,0] == []
array[5,0] == nil
从第 4 个索引开始切片数组,它返回一个空数组,但从第 5 个元素开始,它返回 nil。为什么会发生这种情况?
我有一个简单的数组对象:
array = [:peanut, :butter, :and, :jelly]
它的长度显然是 4!
现在,看看这些陈述:
array[4,0] == []
array[5,0] == nil
从第 4 个索引开始切片数组,它返回一个空数组,但从第 5 个元素开始,它返回 nil。为什么会发生这种情况?
实际上,您发现“奇怪”的事情的原因应该始终在于源代码。我只是从https://github.com/ruby/ruby/blob/trunk/range.c中挑选相关的片段
...
if (beg < 0) {
beg += len;
if (beg < 0)
goto out_of_range;
}
if (err == 0 || err == 2) {
if (beg > len)
goto out_of_range;
if (end > len)
end = len;
}
...
在这里,如果起始索引beg
小于 -length,则返回 out of range Qnil
。否则,如果起始索引大于数组的长度(len
在代码片段中),它也会返回超出范围(Qnil
)。注意这里,它大于不大于或等于,这就是为什么你得到[]
(虽然array[4,0]
4 超出范围)但是nil
array[5,0]
有一秒钟,我以为你发现了一个错误,但我想我可以解释这种行为。您给出的起始索引在该索引处的元素之前slice
被考虑。所以 index被认为是数组的最后(就在 index 之前,就在 index 之后)。下面的例子应该清楚地说明:4
4
3
> [1,2,3,4][0, 3]
# => [1, 2, 3]
> [1,2,3,4][1, 3]
# => [2, 3, 4]
> [1,2,3,4][2, 3]
# => [3, 4]
> [1,2,3,4][3, 3]
# => [4]
> [1,2,3,4][4, 3]
# => []
> [1,2,3,4][5, 3]
# => nil
slice(start, length)
(这是访问时调用的方法)返回一个从 index 开始array[]
的长度数组。这就解释了为什么return 。length
start
array[4,0]
[]
但是,这种方法存在一个极端情况。slice 的 Ruby 文档说:
如果索引(或起始索引)超出范围,则返回 nil。
在您的第二个示例5
中,超出了array
. 这会导致方法返回nil
。