Wie kann ich überprüfen, ob in Ruby eine Variable definiert ist? Gibt es eine isset
Methode vom Typ?
ruby
reflection
Schreibgeschützt
quelle
quelle
nil
ist, initialisiert wird.||=
Operators) weiter unten.defined?
für eine in diesem Block definierte Variable immer noch true zurückgegeben!defined?
solche Methode , die einen Booleschen Wert zurückgibt?!!defined?(object_name)
Dies ist nützlich, wenn Sie nichts tun möchten, wenn es vorhanden ist, sondern es erstellen möchten, wenn es nicht vorhanden ist.
Dadurch wird die neue Instanz nur einmal erstellt. Danach wird die Var einfach weiter zurückgegeben.
quelle
||=
Sie es nur nicht mit booleschen Werten, damit Sie nicht den Schmerz der Verwirrung spüren.nil
sei denn, Sie möchten den Ausdruck wirklich jedes Mal bewerten, wenn er aufgerufen wird, wenn er zurückkehrtnil
var = (var or var.nil?)
Die korrekte Syntax für die obige Anweisung lautet:
Ersetzen (
var
) durch Ihre Variable. Diese Syntax gibt einen True / False-Wert zur Auswertung in der if-Anweisung zurück.quelle
defined?(var) == nil
?.nil?
ist idiomatischer, wie sie sagen. Es ist "objektorientierter", ein Objekt zu fragen, ob esnil
einen Vergleichsoperator verwendet. Beides ist nicht schwer zu lesen. Verwenden Sie also dasjenige, mit dem Sie mehr Produkte versenden können.defined?(your_var)
wird funktionieren. Je nachdem, was Sie tun, können Sie auch so etwas tunyour_var.nil?
quelle
your_var.nil?
weil es true oder false zurückgibt und viel besser zu lesen und zu schreiben ist alsdefined? var
. Danke dafür.your_var.nil?
wird zu einem Fehler führen:undefined local variable or method your_var
wenn nicht vorher definiert ...Versuchen Sie "es sei denn" anstelle von "wenn"
quelle
Verwenden
defined? YourVariable
Sie es einfach albern ..;)
quelle
Hier ist ein Code, nichts Raketenwissenschaft, aber es funktioniert gut genug
Der Farbcode ist natürlich nicht erforderlich, nur eine schöne Darstellung in diesem Spielzeugbeispiel.
quelle
nil?
optional ist.WARNUNG Betreff: Ein allgemeines Rubinmuster
Dies ist die Schlüsselantwort: die
defined?
Methode. Die oben akzeptierte Antwort veranschaulicht dies perfekt.Aber da lauert ein Hai unter den Wellen ...
Betrachten Sie diese Art von häufigem Rubinmuster:
method2
kehrt immer zurücknil
. Beim ersten Aufrufmethod1
wird die@x
Variable nicht gesetzt - dahermethod2
wird sie ausgeführt. undmethod2
wird eingestellt@x
aufnil
. Das ist in Ordnung und alles schön und gut. Aber was passiert beim zweiten Anrufmethod1
?Denken Sie daran, dass @x bereits auf Null gesetzt wurde.
But method2
wird noch wieder laufen !! Wenn Methode2 ein kostspieliges Unterfangen ist, ist dies möglicherweise nicht das, was Sie wollen.Lassen Sie die
defined?
Methode zur Rettung kommen - mit dieser Lösung wird dieser spezielle Fall behandelt - verwenden Sie Folgendes:Der Teufel steckt im Detail: Aber mit der
defined?
Methode können Sie diesem lauernden Hai ausweichen .quelle
Du kannst es versuchen:
Weil es einen Booleschen Wert zurückgibt.
quelle
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
Aussage zu verwenden scheint zu kompliziertWie viele andere Beispiele zeigen, benötigen Sie keinen Booleschen Wert aus einer Methode, um logische Entscheidungen in Ruby zu treffen. Es wäre eine schlechte Form, alles zu einem Booleschen Wert zu zwingen, es sei denn, Sie benötigen tatsächlich einen Booleschen Wert.
Aber wenn Sie unbedingt einen Booleschen Wert brauchen. Verwenden !! (Bang Bang) oder "Falsy Falsy enthüllt die Wahrheit".
Warum es sich normalerweise nicht lohnt, zu zwingen:
Hier ist ein Beispiel, wo es wichtig ist, weil es auf dem impliziten Zwang des booleschen Werts zu seiner Zeichenfolgendarstellung beruht.
quelle
Es sollte erwähnt werden, dass sich die Verwendung
defined
zur Überprüfung, ob ein bestimmtes Feld in einem Hash festgelegt ist, möglicherweise unerwartet verhält:Die Syntax ist hier korrekt, wird jedoch
defined? var['unknown']
als Zeichenfolge ausgewertet"method"
, sodass derif
Block ausgeführt wirdBearbeiten: Die korrekte Notation zum Überprüfen, ob ein Schlüssel in einem Hash vorhanden ist, lautet:
quelle
Bitte beachten Sie die Unterscheidung zwischen "definiert" und "zugewiesen".
x wird definiert, obwohl es nie zugewiesen wird!
quelle
NameError Exception: undefined local variable or method
und war verwirrt, als die einzige Zuweisung / Erwähnung der Variablen in einem if-Block war, der nicht getroffen wurde.Sie können auch überprüfen, ob es in einer Zeichenfolge durch Interpolation definiert ist, wenn Sie Folgendes codieren:
Das System teilt Ihnen den Typ mit, wenn er definiert ist. Wenn es nicht definiert ist, wird nur eine Warnung zurückgegeben, die besagt, dass die Variable nicht initialisiert ist.
Hoffe das hilft! :) :)
quelle
defined?
ist großartig, aber wenn Sie sich in einer Rails-Umgebung befinden, können Sie diese auch verwendentry
, insbesondere in Fällen, in denen Sie einen dynamischen Variablennamen überprüfen möchten:quelle