2016-04-24 69 views
9

例如:在Ruby中,爲什麼nil [1] = 1評估爲零?

nil[1]  #=> NoMethodError 
nil[1]=1 #=> nil 

這不只是語法,因爲它與變量發生過:

a = nil 
a[1]  #=> NoMethodError 
a[1]=1  #=> nil 

奇怪的是:

nil.method(:[]=) #=> NameError 
[].method(:[]=) #=> #<Method...> 

紅寶石2.3.0p0

+0

無法在紅寶石2.2.4重現。也許在你的版本中有一個新功能或一個錯誤? –

+0

奇怪......也許這是一個錯誤。 –

+1

我只能在Ruby 2.3.0中重現這一點,我會假定它是一個錯誤。檢查這個問題的bug跟蹤器可能是值得的(https://bugs.ruby-lang.org)。 – tadman

回答

1

一些隨機的發現:[只限於Ruby 2.3.0p0]

的方法似乎並不存在:

nil.method(:[]=)  #=> NameError: undefined method `[]=' 
nil.respond_to?(:[]=) #=> false 

而且使用send你不能調用它:

nil.send(:[]=)  #=> NoMethodError: undefined method `[]=' 

紅寶石評估既不右手邊,也沒有說法,即

nil[foo]=bar 

不會產生NameError,雖然foobar未定義。

表達似乎等同於nil

$ ruby --dump=insns -e 'nil[foo]=bar' 
== disasm: #<ISeq:<main>@-e>============================================ 
0000 trace   1            ( 1) 
0002 putnil 
0003 leave 

$ ruby --dump=insns -e 'nil' 
== disasm: #<ISeq:<main>@-e>============================================ 
0000 trace   1            ( 1) 
0002 putnil 
0003 leave 
相關問題