2016-04-24 68 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 
相关问题