Rubin: die Meisten prägnanten Weg, um eine ENV-variable, wenn es vorhanden ist, andernfalls verwenden Sie den Standardwert
In Ruby, ich bin versucht zu schreiben, eine Zeile, die eine variable verwendet, wenn es eingestellt wurde, ansonsten Standard zu einigen-Wert:
myvar = # assign it to ENV['MY_VAR'], otherwise assign it to 'foobar'
Konnte ich dies Schreibe code wie folgt:
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 ausführlich, und ich bin versucht zu schreiben Sie es auf die knappste Weise möglich. Wie kann ich dies tun?
- was ist, wenn MY_VAR="" ?
- Für nicht-ENV-Variablen, die nicht scheitern, schön, wenn nicht festgelegt ist, benötigen Sie so etwas wie
defined?( some_variable ) ? some_variable : "default value"
Du musst angemeldet sein, um einen Kommentar abzugeben.
N. B. Dies ist leicht falsch (wenn die hash-Funktion kann den Wert
nil
), aber daENV
enthält nur strings es ist wahrscheinlich gut genug.""
? Beispiel: wenn ich mein ENV-variable mitMY_VAR= rails s
würdemyvar
machte""
oder würde es raus zu"foobar"
?""
. Je nachdem, was Sie für gehen, könnte das gewünschte Ergebnis. Wenn nicht, können Sie auchENV.key?( "MY_VAR" )
um zu sehen, ob die variable überhaupt?Der zuverlässigste Weg für eine Allgemeine Hash ist zu Fragen, ob es die Schlüssel:
Wenn Sie don ' T care about
nil
oderfalse
Werte (d.h. Sie wollen, Sie zu behandeln das gleiche wie "nicht da"), dann undur_gongor der Ansatz gut ist (dies sollte auch in Ordnung sein, wennh
istENV
):Und wenn Sie möchten, dass
nil
werden in Ihren Hash-aber so tun, es ist nicht da (d.h. einnil
Wert ist das gleiche wie "nicht da"), während so dass einefalse
in Ihrem Hash:Am Ende ist es wirklich hängt von Ihren genauen Absichten und Sie sollten den Ansatz wählen, entspricht Ihre Absicht. Die Wahl zwischen
if/else/end
und? :
ist natürlich eine Frage des Geschmacks und "präzise" bedeutet nicht "geringste Anzahl von Zeichen," so fühlen sich frei zu verwenden, eine ternäre oderif
block wie gewünscht.Zurückkehren wird der Wert, wenn es vorhanden ist, und zurück
default_value
wenn der Schlüssel nicht vorhanden ist.hash.fetch(key, default_value)
wenn die Standardeinstellungen nicht vom Schlüssel abhängig sind.hash.fetch(key) { raise "#{key.inspect} doesn't exist!" }
, so war ich nicht 100% sicher, dass die korrekte Reihenfolge, wenn es zwei Parameter.fetch
auch vorhanden also +1 für die ganze API.Array#at
: Sie wissen nichts über es, tutorials nicht abdecken, Sie denken "prägnant" bedeutet "kurz", Sie denken, ein Durcheinander von Symbolen ist mehr Rubyish als eine Methode aufrufen, etc. Programmierer sind ebenso Opfer der Gruppe-denken und die Gewohnheit, wie jeder andere trotz der individualistischen Ader, die viele Programmierer wie zu denken, Sie haben. Aber jetzt Fragen wir uns, in programmers.stackexchange.com Gebiet, und zu riskieren Ketzerei.at
? Weil es mehr Englisch-wie, oder weil Sie akzeptiert weniger Typen von Argumenten?a.push(x)
übera << x
aber (vielleicht aufgrund der schlechten Erfahrungen mit den Menschen über-tun, operator-überladung in C++).Obwohl es nicht relevant in dem spezifischen Beispiel, das Sie Gaben, da Sie wirklich Fragen über hash-Schlüssel, nicht Variablen, die Ruby gibt einen Weg, um zu überprüfen Variablendefinition. Verwenden Sie die
defined?
Schlüsselwort (es ist keine Methode, sondern ein Schlüsselwort, denn es braucht Besondere Behandlung durch den interpreter), etwa so:Damit Sie tun könnten:
Soweit ich weiß, ist das der einzige Weg andere als eine hässliche
begin
/rescue
/end
block eine variable definieren, in der Weise, dass Sie Fragen, ohne zu riskieren einen Fehler. Wie ich schon sagte, gilt das nicht für hashes, da:d.h. Sie überprüft haben, dass die Methode
[]
definiert ist, anstatt die Schlüssel/Wert-paar, die Sie verwenden es, um Zugriff.'foobar'
wird die Standardeinstellung, wennENV['MY_VAR']
ist nicht gesetzt.Andere mögliche alternative, die funktionieren, auch wenn ENV['MEINE_VARIABLE'] turnsout ein false-Wert
Den Nachfrage Juwel, das ich schrieb es ermöglicht extrem präzise und TROCKEN:
Wird dieser
ENV['MY_VAR']
nur, wenn es vorhanden ist. Das heißt, es verwirft es einfach, wenn es ist null, leer oder ein whitespace-only string, was dem Standard statt.Wenn ein Gültiger Wert für
ENV['MY_VAR']
ist falsy (wiefalse
), oder ein Ungültiger Wert truthy (wie""
), dann Lösungen wie die Verwendung von||
würde nicht funktionieren.myvar = ENV['MY_VAR'].is_set? ? ENV['MY_VAR'] : 'foobar'
Diese Weise behalten Sie den .is_set? Methode.
is_set?
eine ruby-Methode? Ich dachte, ich machte das, weil ich nicht wusste, den Namen der Methode, die ich fragte.