2010-09-27 6 views

Répondre

9

Il est principalement utilisé comme shortform pour initialiser une variable à une certaine valeur, si elle n'a pas encore été défini. Pensez à l'instruction en renvoyant x || (x = y). Si x a une valeur (autre que false), seul le côté gauche du || sera évalué (puisque ||court-circuts), et x ne sera pas réaffecté. Toutefois, si x est false ou nil, le côté droit sera évalué, ce qui affectera x à y, et y sera retourné (le résultat d'une instruction d'assignation est le côté droit).

Voir http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case pour plus d'informations.

+0

+1 l'a oublié –

+0

'x || = y' agit comme' x = y sauf si '' (ce qui suppose que x et y sont des expressions arbitraires et pas nécessairement des variables) n'est pas la même chose que = x || y' (considérons les cas où 'x = x' n'est pas un no-op) ou' x = y si x.nil? '(considérez le cas où x est faux). – sepp2k

+0

Jorg W Mittag estime que c'est incorrect, dans [sa réponse] (http://stackoverflow.com/questions/995593/what-does-mean-in-ruby) à la question dupliquée. –

3

L'idée est la même que celle avec d'autres opérateurs similaires (+=, *=, etc.):
a ||= b est a = a || b

Et cette astuce ne se limite pas à Ruby seulement: elle passe par de nombreuses langues avec des racines C.

éditer pour repousser les downvoters. Voir l'un des liens de Jörg pour une approximation plus précise, par exemple this one.
C'est exactement pourquoi je n'aime pas Ruby: rien n'est jamais ce qu'il semble.

+1

Notamment, pas C ou C++ ou Java. – SingleNegationElimination

+0

@TokenMacGuy Je veux dire 'truc' général: produire 'a @ = b' à partir de 'a = a @ b'. –

+0

C'est faux. S'il vous plaît lire http://Ruby-Forum.Com/topic/151660 et les liens fournis. –

4

x ||= y est souvent utilisé au lieu de x = y if x == nil