可能重复:
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?
答案 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)
简短的回答是你要定义一个返回或替换的子字符串。
在开头和结尾处有一个零长度字符串需要可识别。
在双参数索引中,位置实际上是字符之间的个别边界,并且在最后一个字符之后有一个这样的边界。