Wie kann ich überprüfen, ob eine Variable in Ruby definiert ist? Gibt es eine isset
-Typ Methode verfügbar?
Sie haben völlig recht, danke für den Hinweis auf diesen speziellen Vorbehalt
Wie kann ich überprüfen, ob eine Variable in Ruby definiert ist? Gibt es eine isset
-Typ Methode verfügbar?
Dies ist die entscheidende Antwort: die defined?
Methode. Die Website obige Antwort akzeptiert veranschaulicht dies perfekt.
Doch unter den Wellen lauert ein Hai...
Betrachten Sie dieses häufige Rubinmuster:
def method1
@x ||= method2
end
def method2
nil
end
method2
gibt immer zurück nil
.method1
die @x
ist nicht gesetzt - daher method2
ausgeführt werden. undmethod2
wird eingestellt @x
à nil
.Aber was passiert, wenn Sie zum zweiten Mal anrufen? method1
?
Denken Sie daran, dass @x bereits auf Null gesetzt wurde. Aber method2
wird trotzdem wieder betrieben!! Wenn Methode2 ein kostspieliges Unterfangen ist, ist dies vielleicht nicht das, was Sie wollen.
Lassen Sie die defined?
Methode zur Rettung kommen:
def method1
return @x if defined? @x
@x = method2
end
Wie bei den meisten Dingen steckt der Teufel in den Details der Umsetzung.
Hier ist einige Code, nichts Rakete Wissenschaft, aber es funktioniert gut genug
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
Der Farbcode ist natürlich nicht notwendig, sondern dient nur der Veranschaulichung in diesem Beispiel.
Wie viele andere Beispiele zeigen, braucht man eigentlich keinen Booleschen Wert in einer Methode, um in Ruby logische Entscheidungen zu treffen. Es wäre eine schlechte Form, alles in einen Booleschen Wert zu zwingen, es sei denn, man braucht tatsächlich einen Booleschen Wert.
Aber wenn Sie unbedingt einen Booleschen Wert benötigen. Verwenden Sie !! (bang bang) oder "falsy falsy enthüllt die Wahrheit".
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
Warum es sich in der Regel nicht lohnt, Zwang auszuüben:
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
Hier ein Beispiel, bei dem es darauf ankommt, weil es auf der impliziten Umwandlung des booleschen Wertes in seine String-Darstellung beruht.
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
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.