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?

12voto

BenKoshy Punkte 29349

WARNUNG Re: Ein häufiges Ruby-Muster

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
  1. method2 gibt immer zurück nil .
  2. Das erste Mal, dass Sie anrufen method1 die @x ist nicht gesetzt - daher method2 ausgeführt werden. und
  3. method2 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.

0 Stimmen

Sie haben völlig recht, danke für den Hinweis auf diesen speziellen Vorbehalt

10voto

Saqib R. Punkte 2729

Verwenden Sie defined? YourVariable
Keep it simple silly .. ;)

8voto

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.

0 Stimmen

Vermutlich weil die nil? ist fakultativ.

6voto

Bruno Barros Punkte 61

Sie können es versuchen:

unless defined?(var)
  #ruby code goes here
end
=> true

Denn sie gibt einen booleschen Wert zurück.

0 Stimmen

SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND

0 Stimmen

Zur Verwendung eines unless die Aussage erscheint zu kompliziert

5voto

donnoman Punkte 161

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.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