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?

3voto

leberknecht Punkte 1272

Es ist zu erwähnen, dass die Verwendung von defined um zu prüfen, ob ein bestimmtes Feld in einem Hash gesetzt ist, könnte sich unerwartet verhalten:

var = {}
if defined? var['unknown']
  puts 'this is unexpected'
end
# will output "this is unexpected"

Die Syntax ist hier korrekt, aber defined? var['unknown'] wird als Zeichenkette ausgewertet "method" , so dass die if Der Block wird ausgeführt

edit: Die korrekte Schreibweise für die Überprüfung, ob ein Schlüssel in einem Hash existiert, wäre:

if var.key?('unknown')

2voto

Robert Klemme Punkte 2112

Bitte beachten Sie den Unterschied zwischen "definiert" und "zugewiesen".

$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"

x ist definiert, obwohl es nie zugewiesen wird!

0 Stimmen

Das ist etwas, worauf ich gerade gestoßen bin. Ich habe erwartet 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.

1voto

John Donner Punkte 455

defined? ist großartig, aber wenn Sie in einer Rails-Umgebung sind, können Sie auch try insbesondere in Fällen, in denen Sie einen dynamischen Variablennamen überprüfen wollen:

foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo)        # => 1
try(:bar)        # => nil
try(my_foo)      # => 1
try(my_bar)      # => nil

0 Stimmen

Das ist genau das, wonach ich gesucht habe. Ich brauche den Wert, wenn die Variable existiert.

1voto

stevec Punkte 25346

Ich gebe hier ein unglaublich einfaches Beispiel, falls es hilft.

Wenn variabel gibt es nicht :

if defined? a then "hi" end
# => nil

Wenn variabel gibt es :

a = 2
if defined? a then "hi" end
# => "hi"

0voto

Elliott Punkte 295

Sie können auch überprüfen, ob es definiert ist, während in einer Zeichenfolge über Interpolation, wenn Sie Code:

puts "Is array1 defined and what type is it? #{defined?(@array1)}"

Das System teilt Ihnen den Typ mit, wenn er definiert ist. Wenn sie nicht definiert ist, wird lediglich eine Warnung ausgegeben, die besagt, dass die Variable nicht initialisiert ist.

Hoffentlich hilft das! :)

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