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"

4voto

arcresu Points 1702

Bien que cela ne soit pas pertinent dans l'exemple spécifique que vous avez donné puisque vous posez vraiment la question des clés de hachage, et non des variables, Ruby offre un moyen de vérifier la définition des variables. Utilisez l'icône defined? (il ne s'agit pas d'une méthode, mais d'un mot-clé, car il nécessite un traitement spécial par l'interprète), comme suit :

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

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

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

defined? blahblahblah
  #=> nil

Vous pourriez donc le faire :

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

Pour autant que je sache, c'est le seul moyen autre qu'une vilaine begin / rescue / end pour définir une variable de la manière que vous demandez sans risquer une NameError. Comme je l'ai dit, cela ne s'applique pas aux hachages puisque :

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

c'est-à-dire que vous vérifiez que la méthode [] est définie plutôt que la paire clé/valeur à laquelle vous l'utilisez pour accéder.

2voto

Bhavya Points 514

Une autre alternative possible, qui fonctionnera même si ENV['MY_VAR'] s'avère être une fausse valeur

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

1voto

Convincible Points 99

El Demande gem que j'ai écrit permet d'être extrêmement concis et DRY :

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

Cela utilisera ENV['MY_VAR'] seulement s'il est présent. C'est-à-dire qu'il ne l'éliminera que si elle est nil, vide ou une chaîne de caractères avec des espaces, en donnant la valeur par défaut à la place.

Si une valeur valide pour ENV['MY_VAR'] n'est pas fiable (comme false ), ou une valeur invalide est véridique (telle que "" ), alors des solutions comme l'utilisation de || ne fonctionnerait pas.

0voto

QooBee Points 1

Je suis novice en matière de Ruby, je poste la réponse que j'ai trouvée sur 2021, peut-être utile à quelqu'un.

vérifier si la clé env existe :

 include?(name) → true or false
 has_key?(name) → true or false
 member?(name) → true or false
 key?(name) → true or false

récupérer env avec la valeur par défaut :

 ENV.fetch(name, :default_val)

réf : https://docs.ruby-lang.org/en/master/ENV.html

-2voto

Koof Points 75

myvar = ENV['MY_VAR'].is_set? ? ENV['MY_VAR'] : 'foobar'

De cette façon, vous conservez la méthode .is_set ?

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