Operatori Ruby: Double Pipe è uguale a
” Hey, cosa significa ||=
nel tuo codice ruby?”
Nel mio primo post sul blog come programmatore, ho pensato che sarebbe stato opportuno spiegare una delle domande che mi è stato chiesto durante il mio primo giorno alla Flatiron School. Questa è una domanda che mi è venuta in mente circa un mese fa e che mi ha portato in una tana di forum ruby e post reddit (ti risparmierò la fatica e collegherò alcune delle fonti migliori in fondo a questo post).
La controversia dietro “double-pipe equals” è incentrata su come l’operatore dovrebbe essere tradotto, ma mi piacerebbe concentrare questo post sulle applicazioni che ho trovato per questo. Quindi, cosa fa esattamente ||=
? La mia definizione è che “double-pipe equals”è un operatore che assegna un valore, molto simile a =
o al nostro operatore di assegnazione classico, ma completerà l’assegnazione solo se il lato sinistro della nostra operazione restituisce false
o nil
.
Fammi dimostrare.
a = nil
b = 4
a = b #=> 4
a #=> 4
Con a
è impostato su nil
, è facile vedere che l’impostazione di un “pari” b
utilizzando il classico operatore di assegnazione restituisce il valore di 4
. Ma cosa succede se usiamo “double-pipe equals” invece?
a = nil
b = 4
a ||= b #=> 4
a #=> 4
In questo caso, otteniamo lo stesso risultato. Quando a
è impostato su nil
(o qualsiasi cosa che valuti false
), l’operatore ||=
funziona allo stesso modo di =
sarebbe. Diamo un’occhiata a un esempio in cui a
viene dato un valore “veritiero”.
a = 2
b = 4
a ||= b #=> 2
a #=> 2
Nell’esempio precedente, a mantiene il suo valore originale anche se è stato operato attraverso il nostro “double-pipe equals”. Ciò accade perché ||
agisce come un “circuito” in questo metodo. Come spiega Peter Cooper,
Se il lato sinistro del confronto è vero, non è necessario controllare il lato destro.
Quando ruby ha visto che a
era già assegnato al valore di 2
, ha smesso di eseguire il nostro codice.
Dove ho trovato questo tipo di assegnazione condizionale più utile è in iterazione. Facciamo scorrere una serie di frutti popolari, usando il nostro metodo||=
per assegnare ciascuna delle stringhe a a
.
a = nil
array =
array.each do |fruit|
a ||= fruit
end #=> a #=> "apple"
Possiamo vedere che, dopo la nostra iterazione, a
viene assegnato alla prima stringa del nostro array, "apple”
. Dopoa
diventa"apple”
, il nostro “double-pipe equals” non permetterà a nulla a destra di riassegnare la nostra variabile.
Mentre ruby ha metodi che possono restituire il primo elemento di un array senza iterazione, a volte può essere utile controllare se una variabile è stata assegnata o meno con un valore “veritiero”. Di seguito è riportato un frammento di codice da uno dei miei laboratori recenti in cui ho trovato ||=
particolarmente utile.
class School attr_reader :roster def initialize(name)
@name = name
@roster = {}
end def add_student(name, grade)
@roster ||=
@roster << name
endend
Qui, ho definito una classe,School
, insieme a un paio di metodi. La cosa fondamentale da capire è che chiamando roster
su un’istanza della mia classeSchool
, sto cercando di restituire la mia lista di studenti come hash di gradi che puntano a una serie di studenti associati a ciascun grado.
Consente di istanziare una scuola di esempio e popolare alcuni studenti.
metro = School.new("Metro High")
metro.add_student("Jared", 9)
metro.roster #=> {9=>}metro.add_student("Graham", 9)
metro.roster #=> {9=>}
Per aggiungere uno studente per il roster
mio School
istanza, devo passare il add_student
metodo name
e un grade
. Tuttavia, possiamo vedere che quando ho aggiunto "Graham”
e il suo voto corrispondente,9
, il suo nome è stato aggiunto all’array esistente creato quando ho aggiunto"Jared”
. Questa è la magia di ||=
. In questo caso, il “doppio-tubo è uguale a” operatore riconosciuto che un voto chiave è già stato aggiunto e
Era il mio add_student
metodo =
invece di ||=
Avrei sovrascritto il mio studente voce "Jared”
quando ho aggiunto un altro studente in grado di 9
.