/ / W Rubim, dlaczego nil [1] = 1 ocenia na zero? - ruby, null, ruby-2.3

W Ruby, dlaczego nil [1] = 1 ocenia zero? - ruby, null, ruby-2.3

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

Niektó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