在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
虽然foo
和bar
未定义,但不会引发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