web-dev-qa-db-fra.com

Rails: différence entre ENV.fetch () et ENV []

Quelle est la différence entre ces deux syntaxes:

ENV.fetch("MY_VAR")

ENV['MY_VAR']

J'ai vu Rails 5 utilise les deux versions de ceux-ci à des endroits différents et ne peux pas comprendre quelle est la différence (à part le premier étant plus de caractères à taper).

25
Winker

L'objet de type hachage ENV est un Ruby simple, ne fait pas partie de Rails. Extrait du manuel fin ENV#[] :

Récupère la valeur de la variable d'environnement name sous forme de chaîne. Renvoie nil si la variable nommée n'existe pas.

et le fin ENV#fetch manuel :

Récupère la variable d'environnement name.

Si le nom donné n'existe pas et ni default ni un bloc à condition qu'une IndexError soit levée. Si un bloc est donné, il est appelé avec le nom manquant pour fournir une valeur. Si une valeur par défaut est donnée, elle sera retournée quand aucun bloc n'est donné.

Donc, tout comme Hash#[] et Hash#fetch , la seule différence est que fetch vous permet de spécifier le comportement si un la clé est introuvable (utilisez une valeur par défaut passée à fetch, un bloc par défaut passé à fetch, ou déclenchez une exception) tandis que [] vous donne simplement en silence nil si la clé n'est pas trouvée.

Dans le cas particulier de:

ENV.fetch("MY_VAR")
ENV['MY_VAR']

la différence est que ENV['MY_VAR'] vous donnera nil s'il n'y a pas de variable d'environnement MY_VAR mais ENV.fetch('MY_VAR') lèvera une exception.

48
mu is too short