Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby阵列切片,can';我不理解这个简单的代码片段_Ruby_Arrays - Fatal编程技术网

Ruby阵列切片,can';我不理解这个简单的代码片段

Ruby阵列切片,can';我不理解这个简单的代码片段,ruby,arrays,Ruby,Arrays,可能重复: 我有一个简单的数组对象: array = [:peanut, :butter, :and, :jelly] 很明显,它的长度是4 现在,让我们看看这些陈述: array[4,0] == [] array[5,0] == nil 从第4个索引切片数组,它返回一个空数组,但从第5个元素开始,它返回nil。为什么会发生这种情况?slice(start,length)(这是访问array[]时调用的方法)返回一个长度为length的数组,从索引start开始。这解释了为什么数组[4,0

可能重复:

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

array = [:peanut, :butter, :and, :jelly]
很明显,它的长度是4

现在,让我们看看这些陈述:

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

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

然而,在这种方法中有一种特殊情况。说:

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

在第二个示例中,
5
超出了
数组的范围。这会导致该方法返回
nil

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

然而,在这种方法中有一种特殊情况。说:

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


在第二个示例中,
5
超出了
数组的范围。这会导致该方法返回
nil

一秒钟,我以为您发现了一个bug,但我想我可以解释这种行为。您为
切片
指定的起始索引被视为位于该索引处的元素之前的。因此,索引
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]
#=>零

有一秒钟,我以为您发现了一个bug,但我想我可以解释这种行为。您为
切片
指定的起始索引被视为位于该索引处的元素之前的。因此,索引
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]
#=>零

事实上,你觉得“奇怪”的原因应该总是源代码。我只是从中挑选相关的片段

。。。
if(beg<0){
beg+=len;
if(beg<0)
转到\u范围之外的\u;
}
如果(错误==0 | |错误==2){
如果(beg>len)
转到\u范围之外的\u;
如果(结束>len)
结束=len;
}
...

这里,如果起始索引
beg
小于-length,它将返回超出范围
Qnil
。否则,若起始索引大于数组长度(
len
,在代码片段中),它也会返回超出范围(
Qnil
)。注意这里,它大于而不是大于或等于,这就是为什么对于
array[4,0]
(虽然4超出范围)你会得到
[]
,但是对于
array[5,0]

实际上,你觉得“奇怪”的原因应该总是在源代码中。我只是从中挑选相关的片段

。。。
if(beg<0){
beg+=len;
if(beg<0)
转到\u范围之外的\u;
}
如果(错误==0 | |错误==2){
如果(beg>len)
转到\u范围之外的\u;
如果(结束>len)
结束=len;
}
...

这里,如果起始索引
beg
小于-length,它将返回超出范围
Qnil
。否则,若起始索引大于数组长度(
len
,在代码片段中),它也会返回超出范围(
Qnil
)。注意这里,它大于而不是大于或等于,这就是为什么对于
array[4,0]
(虽然4超出范围)会得到
[]
,但是对于
array[5,0]

是,但是4也超出范围。我错了吗?是的,但是4也超出了范围。我错了吗?找到答案了,谢谢!但是我不喜欢:)找到了答案,谢谢!但我不喜欢:)
...
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;
}
...