ruby array - unexpected return

【基本介绍】
这里mark下ruby array遇到的一个问题

【简单例子】

irb(main):040:0> arr
=> [1, 2, 3, 4, 5]
irb(main):041:0> arr[5]
=> nil
irb(main):042:0> arr[5,0] #为什么不是nil?
=> []
irb(main):043:0> arr[6]
=> nil
irb(main):044:0> arr[6,0] #正常理解返回nil
=> nil
irb(main):045:0> arr.length
=> 5


问题:数组的index是从0-N,例子里面的最大下表应该是4,那问题为什么arr[5,0]返回不是nil而是[]


源码:

VALUE
rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
{
VALUE arg;
long beg, len;
if (argc == 2) {
beg = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
if (beg < 0) {
beg += RARRAY_LEN(ary);
}
return rb_ary_subseq(ary, beg, len);
}



VALUE
rb_ary_subseq(VALUE ary, long beg, long len)
{
VALUE klass;
long alen = RARRAY_LEN(ary);
if (beg > alen) return Qnil;
if (beg < 0 || len < 0) return Qnil;
if (alen < len || alen < beg + len) {
len = alen - beg;
}
klass = rb_obj_class(ary);
if (len == 0) return ary_new(klass, 0);
return ary_make_partial(ary, klass, beg, len);
}

源码里面比较的begin与数组长度,比数组长的还回nil,否则还回数组片段。(因为数组的长度其实比下标要大1)


【参考】
[url]https://github.com/ruby/ruby/blob/trunk/array.c[/url]
[url]http://stackoverflow.com/questions/3568222/array-slicing-in-ruby-looking-for-explanation-for-illogical-behaviour-taken-fr[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值