如果我有一个多维数组,我可以超过最终维度的边界并得到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/