79 votes

Rubis : La manière la plus concise d'utiliser une variable ENV si elle existe, sinon utiliser la valeur par défaut.

En Ruby, j'essaie d'écrire une ligne qui utilise une variable si elle a été définie, sinon elle prend une valeur par défaut :

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

Je pourrais écrire ce code comme ceci :

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

Mais c'est plutôt verbeux, et j'essaie de l'écrire de la manière la plus concise possible. Comment puis-je m'y prendre ?

0 votes

Pour les variables non-ENV, qui n'échouent pas bien lorsqu'elles ne sont pas définies, vous devrez utiliser quelque chose comme defined?( some_variable ) ? some_variable : "default value"

105voto

undur_gongor Points 7431
myvar = ENV['MY_VAR'] || 'foobar'

N.B. Ceci est légèrement incorrect (si le hash peut contenir la valeur nil ) mais comme ENV contient juste des cordes, c'est probablement suffisant.

1 votes

Comment cela gère-t-il les chaînes vides ? "" ? Par exemple, si je définis ma variable ENV avec MY_VAR= rails s myvar sont réglés sur "" ou serait-il réglé sur "foobar" ?

1 votes

Réponse : Il sera défini comme une chaîne vide, "" . En fonction de ce que vous recherchez, cela pourrait être le résultat souhaité. Sinon, vous pouvez aussi utiliser ENV.key?( "MY_VAR" ) pour voir si la variable est définie ?

48voto

mu is too short Points 205090

Le moyen le plus fiable pour un hachoir général est de demander s'il a la clé :

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

Si vous ne vous souciez pas de nil o false (c'est-à-dire que vous voulez les traiter de la même manière que "pas là"), alors l'approche d'undur_gongor est bonne (elle devrait également être bonne lorsque h es ENV ) :

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

Et si vous voulez permettre nil d'être dans votre Hash mais de prétendre qu'il n'y est pas (c'est-à-dire une nil est la même chose que "pas là") tout en autorisant une false dans votre Hash :

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

En fin de compte, cela dépend vraiment de votre intention précise et vous devez choisir l'approche qui correspond à votre intention. Le choix entre if/else/end y ? : est, bien sûr, une question de goût et "concis" ne signifie pas "moins de caractères", alors n'hésitez pas à utiliser un ternaire ou un if comme vous le souhaitez.

31voto

Andrew Grimm Points 22996
hash.fetch(key) { default_value }

retournera la valeur si elle existe, et retournera default_value si la clé n'existe pas.

10 votes

Ou hash.fetch(key, default_value) si le défaut ne dépend pas de la clé.

1 votes

@mu est trop court : Oui. D'habitude, je fais hash.fetch(key) { raise "#{key.inspect} doesn't exist!" } Je n'étais donc pas sûr à 100% de l'ordre correct à suivre lorsqu'il y a deux paramètres.

4 votes

J'ai tendance (comme presque tout le monde il semble) à oublier que fetch même existe donc +1 pour utiliser l'ensemble de l'API.

13voto

AvremyC Points 140

C'est ce qui fonctionne le mieux pour moi :

ENV.fetch('VAR_NAME',"5445")

4 votes

Étrange ! Comment cela se fait-il ? Pourriez-vous modifier votre réponse pour nous donner des détails à ce sujet ?

0 votes

J'ai trouvé plus de détails dans cette réponse : stackoverflow.com/questions/47985660/ - Santé

5voto

Firefishy Points 127
myvar = ENV.fetch('MY_VAR') { 'foobar' }

'foobar' étant la valeur par défaut si ENV['MY_VAR'] n'est pas réglé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X