【问题标题】:array[4,0] returns [], but array[5,0] returns nil... why? [duplicate]array[4,0] 返回 [],但是 array[5,0] 返回 nil... 为什么? [复制]
【发布时间】:2011-07-25 04:11:57
【问题描述】:

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

我正在关注 Ruby Koans,我已经完成了处理如下所示数组的部分:

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

其中一个测试侧重于 array[4,0] 返回什么,另一个侧重于 array[5,0] 返回什么。

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

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      开头和结尾都有一个长度为零的字符串,需要可识别。

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

      【讨论】:

        【解决方案3】:

        数组[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);
        

        【讨论】:

        • 为了说“因为这是实现它的代码的行为”,需要付出很多努力。我认为问题实际上是关于为什么实施者认为以这种方式做事是个好主意。 FWIW,在 Python 中,None(我猜相当于nil)将从不返回,而不是空序列。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2013-02-17
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多