0

可能重复:
Ruby 中的数组切片:寻找不合逻辑行为的解释(取自 Rubykoans.com)

我有一个简单的数组对象:

array = [:peanut, :butter, :and, :jelly]

它的长度显然是 4!

现在,看看这些陈述:

array[4,0] == []
array[5,0] == nil

从第 4 个索引开始切片数组,它返回一个空数组,但从第 5 个元素开始,它返回 nil。为什么会发生这种情况?

4

3 回答 3

1

实际上,您发现“奇怪”的事情的原因应该始终在于源代码。我只是从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 超出范围)但是nilarray[5,0]

于 2012-04-15T13:30:01.160 回答
1

有一秒钟,我以为你发现了一个错误,但我想我可以解释这种行为。您给出的起始索引在该索引处的元素之前slice被考虑。所以 index被认为是数组的最后(就在 index 之前,就在 index 之后)。下面的例子应该清楚地说明:443

> [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 
于 2012-04-15T13:16:35.843 回答
1

slice(start, length)(这是访问时调用的方法)返回一个从 index 开始array[]的长度数组。这就解释了为什么return 。lengthstartarray[4,0][]

但是,这种方法存在一个极端情况。slice 的 Ruby 文档说:

如果索引(或起始索引)超出范围,则返回 nil。

在您的第二个示例5中,超出了array. 这会导致方法返回nil

于 2012-04-15T12:50:54.997 回答