2011-12-14 14 views
13

Qualcuno potrebbe spiegarmi il significato del seguente codice Ruby? (Ho visto questo frammento di codice in un singolo progetto di ragazzo):'|| =' operatore in Ruby

car ||= (method_1 || method_2 || method_3 || method_4) 

Qual è la differenza tra il codice di cui sopra e il seguente codice?

car = method_1 || method_2 || method_3 || method_4 

aggiornamento ---------- --------------

Ok, ho avuto il significato di ||= operatore dopo leggere @ La spiegazione di Dave, la mia domanda successiva è se entrambi method_2, method_3 e method_4 restituiscono un valore, quale valore verrà assegnato a car? (Immagino car è nullo inizialmente)

+1

http://stackoverflow.com/questions/995593/what-does-mean-in-ruby –

+1

Duplicato: [Cosa significa '|| =' in Ruby?] (Http://StackOverflow.Com/q/995593 /), [cosa significa '|| =' significa in Ruby?] (Http://StackOverflow.Com/q/3800957/), [cosa è '|| =' in ruby?] (Http: // StackOverflow.Com/q/3945711/), [Double Pipe Symbols in Ruby Variable Assignment?] (Http://StackOverflow.Com/q/4500375/), [Cosa significa l''"| | = =" operando in ruby] (http://StackOverflow.Com/q/5124930/), [cosa significa '|| =' nel linguaggio Ruby?] (http://StackOverflow.Com/q/5230162/), [Is the operatore ruby ​​'|| =' intelligente?] (http://StackOverflow.Com/q/2989862/), ... –

+0

... [Cosa significa '|| =' significa?] (http://StackOverflow.Com/q/ 7556902 /), [cosa fa "' || = '" fare in Ruby 1.9.2?] (Http://StackOverflow.Com/q/7714803/), e probabilmente anche molti altri. Vedi anche [La lista definitiva di '|| =' (OR uguale) discussioni e pagine] (http://Ruby-Forum.Com/topic/151660/). –

risposta

10

E 'un operatore di assegnazione per 'assegnazione condizionale'

Vedi qui ->http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators

assegnazione condizionale:

x = find_something() #=>nil 
x ||= "default"  #=>"default" : value of x will be replaced with "default", but only if x is nil or false 
x ||= "other"  #=>"default" : value of x is not replaced if it already is other than nil or false 

Operatore || = è un forma abbreviata dell'espressione:

x = x || "default" 

EDIT:

Dopo aver visto di modifica del PO, l'esempio è solo un'estensione di questo, il che significa:

car = method_1 || method_2 || method_3 || method_4 

assegnerà il primo non-nullo o il valore di ritorno non falsa di method_1, method_2, method_3 , metodo_4 (in questo ordine) a car o manterrà il suo vecchio valore.

+1

La tua spiegazione è leggermente diversa dalle altre, ma mi piace la tua spiegazione perché hai indicato il punto chiave dell'utilizzo di questo operatore (assegnazione condizionale). Anche se è meglio se puoi anche menzionare x || = Y è uguale a x = x || y –

+0

Per favore controlla il mio aggiornamento, ho una nuova domanda riguardo all'operatore. –

+0

Ehi, lieto di averti aiutato - Ho modificato la mia risposta per includere un piccolo extra - si spera che il tuo primo commento e il tuo aggiornamento delle domande vengano risolti. – Dave

4
car ||= (method_1 || method_2) 

è equivalente a

car = (car || (method_1 || method_2)) 

In generale,

x op= y 

significa

x = x op y 
+0

@ Leem.fin: vedi anche la mia modifica. 'auto || = anything' significa' auto = auto || qualsiasi cosa –

+0

Oh! Io vedo. Ho pensato che sarebbe '||' con tutte le possibili combinazioni con la parte del lato destro del segno '=' è per questo che aggiungo più metodi. –

+0

@ Armen, cosa ne pensi della spiegazione di @Dave –

0

auto || = (metodo_1 || method_2)

è uguale

car = auto || (Method_1 || method_2)

+0

-1. Questo è sbagliato. 'a || = b' è molto più simile a 'a || a = b' di 'a = a || b', sebbene in realtà non sia equivalente a * uno * di questi. –

0

in breve è pari a:

car = car || method_1 || method_2 

più in dettaglio, è un po 'più complessa:

car = (defined?(car) && car) || (method_1 || method_2) 

in ogni caso, ciò che viene dopo la ||= sarà solo essere eseguito se car:

  • non è stato ancora definito
  • è false
  • è nil
1
car ||= (method_1 || method_2 || method_3 || method_4) 

vettura manterrà il suo valore dopo questa affermazione viene eseguito, se auto inizialmente non è pari a zero.

Se auto era nullo prima di questa istruzione, il primo valore non nullo da restituire da method_1, metodo_2, ... verrà assegnato all'automobile.


car = method_1 || method_2 || method_3 || method_4 

In questo caso, l'automobile sarà nuovamente assegnato il primo valore non nullo per tornare fuori dei metodi, anche se auto ha già un valore non nullo prima di questa dichiarazione ha

3

il ||= l'operatore controlla prima se il valore car è già impostato. Se car restituisce zero, verrà assegnato il primo valore sul lato destro che non restituisce nil o false.

Quindi, dato il vostro esempio dall'alto, se si assegna un valore a macchina come

car = "BMW" 

e si esegue si codice frammento, il valore di auto sarà ancora "BMW";

Se method_1 rendimenti (per esempio) la stringa "Value from Method 1" e auto è nil o false, allora macchina questa stringa verranno assegnati ad auto

car = nil 
car ||= (method_1 || method_2) 
car # => "Value from Method 1" 

Se method_1 restituisce anche nil/false, controllerà per la valore in method_2, e così via, finché non ottiene una sorta di valore vero

La differenza con il tuo secondo snippet di codice è che, in caso di ||=, la variabile car verrà valutata per prima e impostata se si tratta di diventa nullo o falso.

Se si utilizza solo =, non verrà eseguita alcuna valutazione e la vettura verrà impostata sul primo valore a destra che non restituisce nulla o falso.

- AGGIORNAMENTO -

Per rispondere alla tua domanda di aggiornamento, il valore sul lato destro saranno valutati da sinistra a destra, in modo che il primo che non restituisce verranno assegnati nil o false.

car = nil 
# method_1 => "nil" 
# method_2 => "false" 
# method_3 => "value method 3" 
# method_4 => "I won't be called" 

car ||= (method_1 || method_2 || method_3 || method_4) 
# => "value method 3" 
+0

Ciao, la tua risposta è anche eccellente. Ho svalutato il tuo. Grazie! –

+0

grazie, e grazie :-) – klaffenboeck

0

risposta per l'aggiornamento:

method_2 viene assegnato dal momento che è il primo non-falso, valore non-nil nella lista.