/ / Em Ruby, por que nil [1] = 1 é avaliado como nulo? - rubi, nulo, rubi-2.3

Em Ruby, por que nil [1] = 1 é avaliado como nulo? - rubi, nulo, rubi-2.3

Por exemplo:

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

Não é apenas sintaxe, como acontece com as variáveis ​​também:

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

Estranhamente:

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

Rubi 2.3.0p0

Respostas:

1 para resposta № 1

Algumas descobertas aleatórias: [apenas em Ruby 2.3.0p0]

O método não parece existir:

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

E você não pode invocá-lo usando send:

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

Ruby não avalia nem o lado direito nem o argumento, ou seja

nil[foo]=bar

não levanta um NameError, Apesar foo e bar são indefinidos.

A expressão parece ser equivalente a 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