390 votes

Qu'est-ce que || = (ou égal à) signifie en Ruby?

Que signifie le code suivant dans Ruby?

 ||=
 

A-t-il un sens ou une raison à la syntaxe?

664voto

Steve Bennett Points 4273

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 += ba = a + b

a ||= ba || 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:

177voto

Jörg W Mittag Points 153275

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.

35voto

the_minted Points 161

Réponse concise et complète

 a ||= b
 

est équivalent à chacune des lignes suivantes

 a || a = b
a ? a : a = b
if a then a else a = b end
 

-

D'autre part,

 a = a || b
 

est équivalent à chacune des lignes suivantes

 a = a ? a : b
if a then a = a else a = b end
 

30voto

vidaica Points 1337

En bref, a||=b signifie: Si a est évalué à faux (faux, nul) ou si a est indéfini, affectez b à a. Sinon, gardez un intact.

8voto

 x ||= y
 

est

 x || x = y
 

"si x est faux ou non défini, alors x pointe sur y"

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