Que signifie le code suivant dans Ruby?
||=
A-t-il un sens ou une raison à la syntaxe?
Que signifie le code suivant dans Ruby?
||=
A-t-il un sens ou une raison à la syntaxe?
L'on a accepté la réponse est cryptique et envoie le lecteur vers des sources externes, au lieu de répondre directement, donc je vais tenter une réponse.
a ||= b
est un "conditionnel opérateur d'affectation". C'est une abréviation de" a || a = b
.
Il signifie "si a
est faux, nul ou indéfini, puis d'évaluer les b
et définissez a
pour le résultat". Ruby court-circuit de l'évaluation signifie que si a
est définie et évaluée à true, alors le côté droit de l'opérateur n'est pas évalué, et aucune cession a lieu. Cette distinction est sans importance si a
et b
sont à la fois des variables locales, mais il est significatif si l'un des deux est un getter/setter méthode d'une classe.
Par exemple:
> a ||= 1;
=> 1
> a ||= 2;
=> 1
> foo = false;
=> false
> foo ||= true;
=> true
> foo ||= false;
=> true
Point de prêter à confusion, il ressemble à d'autres opérateurs d'affectation (comme +=
), mais se comporte différemment.
a += b
→ a = a + b
a ||= b
→ a || a = b
Il y a apparemment des nuances, des exceptions, des cas particuliers, mais c'est l'essence. N'hésitez pas à prolonger et améliorer cette réponse.
Pour en savoir plus:
Cette question a été examinée de façon souvent sur le Rubis de listes de diffusion et Ruby blogs qu'il y a maintenant même les threads sur le Rubis de la liste de diffusion dont le seul but est de collecter des liens vers tous les autres threads sur le Rubis de la liste de diffusion que de débattre de cette question.
En voici un: La liste définitive des ||= (OU Égal) de threads et des pages
Si vous vraiment voulez savoir ce qui se passe, prendre un coup d'oeil à la Section 11.3.1.2 "en Abrégé" attributions du Langage Ruby Projet de Spécification.
En première approximation,
a ||= b
est équivalent à
a || a = b
et pas équivalent à
a = a || b
Ce n'est cependant qu'une première approximation, surtout si a
n'est pas défini. La sémantique diffèrent également selon qu'il s'agit d'une simple affectation de variable, une méthode d'affectation ou d'une indexation de la cession:
a ||= b
a.c ||= b
a[c] ||= b
sont traités différemment.
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.