array [4,0]返回[],但是数组[5,0]返回nil ...为什么?

时间:2011-07-25 04:11:57

标签: ruby arrays

  

可能重复:
  Array slicing in Ruby: looking for explanation for illogical behaviour (taken from Rubykoans.com)

我正在关注Ruby Koans并且我已经开始处理一个看起来像这样的数组:

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

其中一个测试重点关注数组[4,0]返回的内容,另一个重点关注数组[5,0]返回的内容。

这个数组中只有4个元素,这意味着它可以达到数组[3],对吗?那么为什么array [4,0]返回一个空数组而array [5,0]返回nil?

3 个答案:

答案 0 :(得分:6)

该方法的两个参数版本与预期的行为略有不同,您可以获得a full explanation by Gary Wright here

答案 1 :(得分:1)

阵列[4,0]:

len=0 and beg=4
beg > RARRAY_LEN   => false
len == 0           => return ary_new(klass, 0) => []

阵列[5,0]:

len=0 and beg=5
beg > RARRAY_LEN   => true => return Qnil => nil

array.c:rb_ary_subseq

VALUE
rb_ary_subseq(VALUE ary, long beg, long len)
{
     VALUE klass;

     if (beg > RARRAY_LEN(ary)) return Qnil;
     if (beg < 0 || len < 0) return Qnil;

     if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) {
        len = RARRAY_LEN(ary) - beg;
     }
     klass = rb_obj_class(ary);
     if (len == 0) return ary_new(klass, 0);

答案 2 :(得分:1)

[i,n] 表单是识别子字符串边界而不是字符

简短的回答是你要定义一个返回或替换的子字符串。

在开头和结尾处有一个零长度字符串需要可识别。

在双参数索引中,位置实际上是字符之间的个别边界,并且在最后一个字符之后有一个这样的边界。