Ruby Koans - about_arrays.rb

3

我正在Ruby Koans中处理about_arrays.rb文件,发现这段代码,但不确定答案为什么是这样的:

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

  assert_equal [], array[4,0]
  assert_equal [], array[4,100]
  assert_equal nil, array[5,0]
end

基于 Ruby Koans 的输出,能否有人解释一下为什么 array[4,0] 会被计算为[],而array[5,0] 被计算为nil? 为什么 array[5,0] 不会也被计算为 []
出于好奇心,我尝试了 array[6,0], array[7,0] 等等,都得到了nil。Ruby 对于下一个需要添加到其中的数组索引有特殊的处理吗?
编辑:
我找到了 "Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)",它问了同样的问题,但我仍然不理解数组切片中索引是如何工作的。
1个回答

6
定义在字符前后的位置,通常是在一个字符之前和另一个字符之后。

来源

切片的第一个参数是下限。当它为4时,仍然是数组的一部分,只是指向最后一个元素。当下限超出数组长度时,它总是nil

最好将偏移量视为元素值之间的空格。

RubyFiddle


为什么下限是4?数组的索引不是从0到3吗? - wmock
@WillsonMock的索引不等于切片边界。请参考链接。 - alex
抱歉,我还不太清楚。当您提到数组的边界时,您是不是指数组的第一个和最后一个索引? - wmock
1
@WillsonMock 我刚刚添加了一个RubyFiddle来帮助解释。当你从3,4切片时,你得到的是该数组中的最后一个元素,所以你可以看到4是一个有效的边界。因此,如果你从4开始切片,你指向的是数组的末尾,从那里切片0个元素将会得到一个空数组。可能有人比我更好地解释它。 :) - alex
1
“空切片”用于数组作为左值表达式时的插入而非替换。因此,array[4,0]=object 会在最后一个元素之后插入对象,array[3,0]=object 会在最后一个元素之前插入对象等等。非空切片将替换元素。 - David Unric
@alex 空切片总是定义在起始索引之前的位置,因此最后一个元素之后的位置必须用 (最后一个元素的索引 + 1) 进行索引。 - David Unric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接