Na przykład:
nil[1] #=> NoMethodError
nil[1]=1 #=> nil
To nie jest tylko składnia, jak to ma miejsce w przypadku zmiennych:
a = nil
a[1] #=> NoMethodError
a[1]=1 #=> nil
Dziwnie:
nil.method(:[]=) #=> NameError
[].method(:[]=) #=> #<Method...>
Ruby 2.3.0p0
Odpowiedzi:
1 dla odpowiedzi № 1Niektóre przypadkowe wyniki: [tylko w Ruby 2.3.0p0]
Metoda wydaje się nie istnieć:
nil.method(:[]=) #=> NameError: undefined method `[]="
nil.respond_to?(:[]=) #=> false
I nie możesz go wywołać za pomocą send
:
nil.send(:[]=) #=> NoMethodError: undefined method `[]="
Ruby nie ocenia ani prawej strony, ani argumentu, tj.
nil[foo]=bar
nie podnosi a NameError
, mimo że foo
i bar
są niezdefiniowane.
Wyrażenie wydaje się być równoważne 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