2016-04-24 12 views
9

Zum Beispiel:In Ruby, warum bewertet Nil [1] = 1 zu Null?

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

Es ist nicht nur Syntax, wie es auch mit Variablen geschieht:

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

Seltsamer:

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

Rubin 2.3.0p0

+0

nicht zum Ruby 2.2.4 reproduzieren kann. Vielleicht eine neue Funktion oder ein Fehler in Ihrer Version? –

+0

Seltsam ... Vielleicht ist es ein Fehler. –

+1

Ich kann das nur in Ruby 2.3.0 reproduzieren und ich gehe davon aus, dass es ein Bug ist. Es könnte sich lohnen, den [Bug Tracker für dieses Problem] (https://bugs.ruby-lang.org) zu überprüfen. – tadman

Antwort

1

zufällig Einiges Ergebnisse: [nur in Ruby 2.3.0p0]

Das Verfahren scheint nicht zu existieren:

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

Und Sie es send mit nicht aufrufen können:

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

Rubin wertet weder die rechte Seite, noch das Argument,

dh
nil[foo]=bar 

erhebt keine NameError, obwohl foo und bar sind nicht definiert.

Der Ausdruck scheint entspricht nil zu sein:

$ 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