如果我有一个多维数组,我可以超过最终维度的边界并得到nil返回,但是如果我超过了非最终维度的边界,我会收到一个错误。这是故意的吗?如果是这样的话,理由是什么?

> ar = [ [00,01,02], [10,11,12], [20,21,22] ]
=> [[0, 1, 2], [10, 11, 12], [20, 21, 22]]
> ar[2][2]
=> 22
> ar[2][3]
=> nil
> ar[3][2]
NoMethodError: undefined method `[]' for nil:NilClass
from (irb):32
from :0

我理解为什么会发生这种情况,但是为什么nil[]没有定义为返回nil?

最佳答案

我不知道Matz是否记录过NilClass的设计方式。如果不是这样,我们只能猜测。我的猜测是,这是基于Smalltalk的行为。
nil可能是消息吃掉或异常引发。ruby有一个抛出nil对象的异常。
如果您有一条消息吃nil,那么很难确定在链式调用(如arr[1][2][3])中第一个返回nil的对象。我不知道这真的是一个问题,但它似乎是一个有效的观点。作为一个反例,objective-c似乎可以很好地处理一个吃空的消息。
你可以修补NilClass成为消息吃

class NilClass
  def method_missing(*)
    nil
  end
end

或仅用于数组
class NilClass
  def []
    nil
  end
end

两者都使nil[]返回nil,并且都可以中断现有代码
nil[][][][]
=> nil

关于ruby - ruby 的多维数组越界行为是否一致?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9766980/

10-10 01:04
查看更多