在Ruby中,为什么nil = 1评估为nil?

例如:

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

这不仅仅是语法,因为变量也是如此:

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

奇怪:

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

Ruby 2.3.0p0

一些随机发现: [仅在Ruby 2.3.0p0]

该方法似乎不存在:

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

你不能使用send调用它:

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

Ruby既不评估右侧,也不评估参数,即

 nil[foo]=bar 

虽然foobar未定义,但不会引发NameError

表达式似乎等于nil

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