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 № 1Algumas 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