Ruby "Definiert?" -Operator funktioniert falsch?

8

Also, wir haben den Code:

%Vor%

Und ruf es von irb:

%Vor%

Und das wird zurückkehren:

%Vor%

Und jetzt ist die Frage - warum? Wir haben Ausnahme vor als some_variable definiert. Warum funktioniert das so? Warum some_variable ist in sure-Block definiert? (Btw, es definiert als Null)

UPDATE: Danke @Max für die Antwort, aber wenn wir Code ändern, um Instanzvariable zu verwenden:

%Vor%

Es funktioniert wie erwartet:

%Vor%

Warum?

    
mr.The 31.03.2015, 15:07
quelle

1 Antwort

5

Das erste, was zu bemerken ist, dass defined? ein Schlüsselwort ist, keine Methode. Das bedeutet, dass vom Parser während der Kompilierung speziell behandelt wird , wenn der Syntaxbaum erstellt wird ( genau wie if , return , next , usw.) anstatt zur Laufzeit dynamisch nachgeschlagen zu werden.

Dies ist der Grund, warum defined? mit Ausdrücken umgehen kann, die normalerweise einen Fehler auslösen würden: defined?(what is this even) #=> nil , weil der Parser sein Argument vom normalen Auswertungsprozess ausschließen kann.

Das wirklich verwirrende Bit ist, dass obwohl es ein Keyword ist, sein Verhalten immer noch bestimmt ist Laufzeit Es verwendet parser magic, um zu bestimmen, ob sein Argument eine Instanzvariable, Konstante, Methode usw. ist. aber ruft normale Ruby-Methoden auf, um zu bestimmen, ob diese spezifischen Typen zur Laufzeit definiert wurden:

%Vor%

Diese rb_cvar_defined -Funktion ist dieselbe, die von % co_de aufgerufen wird % zum Beispiel.

Also Module#class_variable_defined? ist seltsam. Sehr seltsam. Das Verhalten kann je nach Argument sehr unterschiedlich sein, und ich würde nicht einmal darauf wetten, dass es bei verschiedenen Ruby-Implementierungen gleich ist. Auf dieser Grundlage würde ich empfehlen, sie nicht zu verwenden und statt dessen die Methoden defined? von Ruby zu verwenden.

    
Max 31.03.2015, 15:16
quelle

Tags und Links