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

lar*_*sch 9 ruby null ruby-2.3

例如:

nil[1]     #=> NoMethodError
nil[1]=1   #=> nil
Run Code Online (Sandbox Code Playgroud)

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

a = nil
a[1]       #=> NoMethodError
a[1]=1     #=> nil
Run Code Online (Sandbox Code Playgroud)

奇怪:

nil.method(:[]=)   #=> NameError
[].method(:[]=)    #=> #<Method...>
Run Code Online (Sandbox Code Playgroud)

Ruby 2.3.0p0

Ste*_*fan 1

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

该方法似乎不存在:

nil.method(:[]=)      #=> NameError: undefined method `[]='
nil.respond_to?(:[]=) #=> false
Run Code Online (Sandbox Code Playgroud)

并且您不能使用以下方式调用它send

nil.send(:[]=)        #=> NoMethodError: undefined method `[]='
Run Code Online (Sandbox Code Playgroud)

Ruby 既不计算右侧,也不计算参数,即

nil[foo]=bar
Run Code Online (Sandbox Code Playgroud)

不会引发 a 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
Run Code Online (Sandbox Code Playgroud)