wake-up-neo.net

Ruby: Die präziseste Möglichkeit, eine ENV-Variable zu verwenden, falls vorhanden, andernfalls Standardwert verwenden

In Ruby versuche ich, eine Zeile zu schreiben, in der eine Variable verwendet wird, falls diese festgelegt wurde.

myvar = # assign it to ENV['MY_VAR'], otherwise assign it to 'foobar'

Ich könnte diesen Code so schreiben:

if ENV['MY_VAR'].is_set? #whatever the function is to check if has been set
  myvar = ENV['MY_VAR']
else
  myvar = 'foobar'
end

Aber das ist ziemlich wortreich und ich versuche es so kurz wie möglich zu schreiben. Wie kann ich das machen?

45
Andrew
myvar = ENV['MY_VAR'] || 'foobar'

N.B. Dies ist etwas falsch (wenn der Hash den Wert nil enthalten kann), aber da ENV nur Strings enthält, ist dies wahrscheinlich gut genug.

58
undur_gongor

Der zuverlässigste Weg für einen allgemeinen Hash ist die Abfrage, ob er den Schlüssel hat:

myvar = h.has_key?('MY_VAR') ? h['MY_VAR'] : 'default'

Wenn Sie sich nicht für nil- oder false-Werte interessieren (d. H. Sie möchten sie als "nicht da" behandeln), ist der Ansatz von undur_gongor gut (dies sollte auch in Ordnung sein, wenn hENV ist):

myvar = h['MY_VAR'] || 'foobar'

Und wenn Sie zulassen möchten, dass nil in Ihrem Hash ist, aber so tun, als wäre es nicht da (d. H. Ein nil-Wert ist das Gleiche wie "nicht da"), während Sie eine false in Ihrem Hash zulassen:

myvar = h['MY_VAR'].nil?? 'foobar' : h['MY_VAR']

Am Ende hängt es wirklich von Ihrer genauen Absicht ab, und Sie sollten den Ansatz wählen, der Ihrer Absicht entspricht. Die Wahl zwischen if/else/end und ? : ist natürlich eine Geschmackssache und "prägnant" bedeutet nicht "kleinste Anzahl von Zeichen". Sie können also nach Belieben einen ternären oder if-Block verwenden.

33
mu is too short
hash.fetch(key) { default_value }

Gibt den Wert zurück, wenn er vorhanden ist, und default_value, wenn der Schlüssel nicht vorhanden ist.

19
Andrew Grimm

Obwohl es in dem von Ihnen gegebenen Beispiel nicht relevant ist, da Sie wirklich nach Hash-Schlüsseln und nicht nach Variablen fragen, bietet Ruby eine Möglichkeit, die Variablendefinition zu überprüfen. Verwenden Sie das defined?-Schlüsselwort (es handelt sich nicht um eine Methode, sondern um ein Schlüsselwort, da es vom Interpreter speziell behandelt werden muss).

a = 1
defined? a
  #=> "local-variable"

@a = 2
defined? @a
  #=> "instance-variable"

@@a = 3
defined? @@a
  #=> "class-variable"

defined? blahblahblah
  #=> nil

Daher könnten Sie folgendes tun:

var = defined?(var) ? var : "default value here"

Soweit ich weiß, ist dies die einzige Möglichkeit, einen hässlichen begin/rescue/end-Block zu definieren, um eine Variable so zu definieren, wie Sie es wünschen, ohne einen Namensfehler zu riskieren. Wie gesagt, das gilt nicht für Hashes seit:

hash = {?a => 2, ?b => 3}
defined? hash[?c]
  #=> "method"

sie prüfen also, dass die Methode [] definiert ist und nicht das Schlüssel/Wert-Paar, auf das Sie zugreifen.

4
Carl Suster
myvar = ENV.fetch('MY_VAR') { 'foobar' }

'foobar' ist die Standardeinstellung, wenn ENV['MY_VAR'] nicht festgelegt ist.

2
Firefishy

Eine andere mögliche Alternative, die auch dann funktioniert, wenn ENV ['MY_VAR'] ein falscher Wert ist

myvar  = ENV['MY_VAR'].presence || 'foobar'
1
Bc91

Der Demand Gem, den ich geschrieben habe, lässt dies extrem knapp und trocken sein:

myvar = demand(ENV['MY_VAR'], 'foobar')

Dies wird ENV['MY_VAR'] nur verwenden, wenn es vorhanden ist. Das heißt, es wird nur dann verworfen, wenn es null, leer oder eine Zeichenfolge ist, die nur aus Leerzeichen besteht.

Wenn ein gültiger Wert für ENV['MY_VAR'] falsch ist (wie false) oder ein ungültiger Wert wahr ist (wie ""), funktionieren Lösungen wie || nicht.

0
Convincible