2014-11-14 45 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實際上會返回一個值。