614 Stimmen

Prüfen, ob eine Variable definiert ist?

Wie kann ich überprüfen, ob eine Variable in Ruby definiert ist? Gibt es eine isset -Typ Methode verfügbar?

820voto

Ricardo Acras Punkte 35294

Verwenden Sie die defined? Schlüsselwort ( Dokumentation ). Es wird ein String mit der Art des Elements zurückgegeben, oder nil wenn sie nicht existiert.

>> a = 1
 => 1
>> defined? a
 => "local-variable"
>> defined? b
 => nil
>> defined? nil
 => "nil"
>> defined? String
 => "constant"
>> defined? 1
 => "expression"

Wie skalee kommentierte: "Es ist erwähnenswert, dass eine Variable, die auf null gesetzt ist, initialisiert wird."

>> n = nil  
>> defined? n
 => "local-variable"

94 Stimmen

Es ist erwähnenswert, dass die Variable, die auf nil ist initialisiert.

7 Stimmen

Wenn Sie eine Variable setzen wollen, wenn sie nicht existiert, und sie in Ruhe lassen wollen, wenn sie existiert, lesen Sie die Antwort von @danmayer (mit dem ||= Operator) unten.

2 Stimmen

Hier ist eine weitere Kuriosität, die ich in Wenn Sie eine Variable in einem if-Block definieren, für die die Bedingung nie erfüllt ist, defined? liefert immer noch true für eine Variable, die in diesem Block definiert ist!

95voto

danmayer Punkte 4218

Dies ist nützlich, wenn Sie nichts tun wollen, wenn es bereits existiert, aber es erstellen wollen, wenn es nicht existiert.

def get_var
  @var ||= SomeClass.new()
end

Dadurch wird die neue Instanz nur einmal erstellt. Danach gibt es nur noch die var.

9 Stimmen

Auch das ist sehr idiomatisch und übrigens typisch Ruby.

0 Stimmen

Vielen Dank für diesen Beitrag! Ich bin ein Ruby/Rails-Anfänger und stieß gestern Abend auf diese Syntax, hatte eine harte Zeit herauszufinden, was es bedeutet. Sieht sehr praktisch aus!

39 Stimmen

Benutzen Sie einfach nicht ||= mit booleschen Werten, damit Sie nicht den Schmerz der Verwirrung spüren.

71voto

foomip Punkte 1375

Die korrekte Syntax für die obige Aussage lautet:

if (defined?(var)).nil? # will now return true or false
 print "var is not defined\n".color(:red)
else
 print "var is defined\n".color(:green)
end

ersetzend ( var ) mit Ihrer Variablen. Diese Syntax gibt einen true/false-Wert für die Auswertung in der if-Anweisung zurück.

11 Stimmen

Das ist nicht notwendig, da nil bei Verwendung in einem Test als falsch ausgewertet wird

0 Stimmen

Warum nicht defined?(var) == nil ?

0 Stimmen

@vol7ron - Das ist eine absolut gültige Syntax. Mit dem Aufruf von .nil? ist idiomatischer, wie man sagt. Es ist eher "objektorientiert", ein Objekt zu fragen, ob es nil als einen Vergleichsoperator zu verwenden. Keiner von beiden ist schwer zu lesen, also verwenden Sie denjenigen, der Ihnen hilft, mehr Produkte zu versenden.

20voto

digitalsanctum Punkte 3213

defined?(your_var) wird funktionieren. Je nachdem, was Sie tun, können Sie auch etwas tun wie your_var.nil?

0 Stimmen

+1 für your_var.nil? weil es true oder false zurückgibt und viel angenehmer zu lesen und zu schreiben ist als defined? var . Vielen Dank dafür.

29 Stimmen

your_var.nil? wird zu einem Fehler führen: undefined local variable or method your_var wenn nicht vorher definiert...

16voto

user761856 Punkte 171

Versuchen Sie "unless" anstelle von "if"

a = "apple"
# Note that b is not declared
c = nil

unless defined? a
    puts "a is not defined"
end

unless defined? b
    puts "b is not defined"
end

unless defined? c
    puts "c is not defined"
end

0 Stimmen

Was fügt diese Antwort hinzu, was in den anderen Antworten nicht gesagt wurde?

2 Stimmen

Das beantwortet die Frage sehr schön auf eine weitere nützliche Weise, nicht wahr?

2 Stimmen

Der Ruby-Style-Guide sagt: "Bevorzuge unless gegenüber if für negative Bedingungen". github.com/bbatsov/ruby-style-guide

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X