2014-11-14 31 views
0

我一直认为很好的ruby特性是nil默认用于索引/哈希查找,例如,Ruby/Rails没有使嵌套索引安全吗?

[1, 2, 3][42]   # => nil 
{ foo: :bar }[:spam] # => nil 

有,为什么在Ruby的设计或Ruby on Rails的核心扩展,这还没有扩展到嵌套查询工作(而不是抛出NoMethodError: undefined method '[]' for nil:NilClass)理由吗?

例如:

{ foo: [1, 2, 3] }[:bar][0][:baz] # => nil 
[[[]]][12][1][1]     # => nil 

在我,也许Nieve酒店,了解它是那样简单:

class NilClass 
    def [](_); end 
end 
+0

看看它做你想做的尝试命令。 – Doon 2014-11-14 22:24:59

+0

我知道'try'。由于嵌套查找非常普遍,所以我想知道为什么这种情况没有被优化。 – mjgpy3 2014-11-14 22:26:15

+1

你会如何区分'h [:k1] [:k2]'和'nil [:k2]'之间的区别?你提出的'NilClass'补丁太过分了,它会以方便的名义隐藏缺陷。 – 2014-11-14 22:39:01

回答

1

有些语言,如Objective-C中,使方法调用nil对象返回nil,所以这些错误消失。

Rails一直采取“whither nil”的路径,其中任何方法调用硬失败。这已成为预期的行为。

如果要修补NilClass,做到彻底:

def NilClass 
    def method_missing(*args) 
    # Do nothing, return nil 
    end 
end 

可以在config/initializers添加此压制错误,但被警告,这可能隐藏合法的问题,使您的应用程序中不可预知的方式进行。例如。 nil.id实际上会返回一个值。