Articles

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 aera 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, aviene 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 rostersu 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 .