Ruby Operators: Double Pipe Er Lik
» Hei, Hva betyr det ||=
betyr i ruby-koden din?»
i mitt første blogginnlegg som programmerer, tenkte jeg det ville være hensiktsmessig å forklare et av spørsmålene jeg ble spurt i løpet av min første dag på Flatiron School. Dette er et spørsmål som jeg hadde kommet opp for en måned siden, og en som førte meg ned i et kaninhull av ruby-fora og reddit-innlegg (jeg sparer deg for problemer og kobler noen av de bedre kildene nederst i dette innlegget).kontroversen bak «double-pipe equals» er sentrert rundt hvordan operatøren skal oversettes, men jeg vil gjerne fokusere dette innlegget på programmene jeg har funnet for det. Så, hva gjør ||=
? Min egen definisjon er at «double-pipe equals» er en operatør som tildeler en verdi, mye som =
eller vår klassiske oppdragsoperatør, men vil bare fullføre oppdraget hvis venstre side av operasjonen returnerer false
eller nil
.
la meg demonstrere.
a = nil
b = 4
a = b #=> 4
a #=> 4
med a
satt til nil
, er det lett å se at å sette en «lik» til b
ved å bruke den klassiske oppdragsoperatøren vil du returnere en med verdien av 4
. Men hva om vi brukte «double-pipe equals» i stedet?
a = nil
b = 4
a ||= b #=> 4
a #=> 4
I dette tilfellet får vi det samme resultatet. Når a
er satt til nil
(eller noe som evaluerer til false
), fungerer ||=
operatoren på samme måte som =
ville. La oss se på et eksempel der a
er gitt en «truthy» verdi.
a = 2
b = 4
a ||= b #=> 2
a #=> 2
i eksemplet ovenfor beholder a sin opprinnelige verdi selv om den har blitt operert på gjennom våre «dobbel-pipe equals». Dette skjer fordi ||
fungerer som en «krets» i denne metoden. Som Peter Cooper forklarer,
hvis venstre side av sammenligningen er sant, er det ikke nødvendig å sjekke høyre side.
da ruby så at a
allerede var tildelt verdien av 2
, stoppet den å utføre koden vår.
hvor jeg har funnet denne typen betinget oppgave mest nyttig er i iterasjon. La oss iterere gjennom en rekke populære frukter, ved hjelp av vår ||=
metode for å tildele hver av strengene til a
.
a = nil
array =
array.each do |fruit|
a ||= fruit
end #=> a #=> "apple"
Vi kan se at, etter vår iterasjon,a
er tilordnet den første strengen i vårt utvalg,"apple”
. Etter a
blir "apple”
, vil våre» dobbeltrør lik » ikke la noe til høyre for det overføre vår variabel.
mens ruby har metoder som kan returnere det første elementet i en matrise uten iterasjon, kan det noen ganger være nyttig å kontrollere om en variabel har blitt tildelt en «truthy» – verdi. Nedenfor er en kodebit fra en av mine siste laboratorier der jeg fant ||=
spesielt nyttig.
class School attr_reader :roster def initialize(name)
@name = name
@roster = {}
end def add_student(name, grade)
@roster ||=
@roster << name
endend
her har jeg definert en klasse, School
, sammen med et par metoder. Det viktigste å forstå er at ved å ringeroster
på en forekomst av min School
klasse, ønsker jeg å returnere listen over studenter som en hash av karakterer som peker på en rekke studenter knyttet til hver klasse.
lar instantiate et eksempel skole og fylle noen elever.
metro = School.new("Metro High")
metro.add_student("Jared", 9)
metro.roster #=> {9=>}metro.add_student("Graham", 9)
metro.roster #=> {9=>}
for å legge til en student i roster
av min School
forekomst, må jeg passere add_student
metode a name
og en grade
. Vi kan imidlertid se at når jeg la til "Graham”
og hans tilsvarende karakter, 9
, ble navnet hans lagt til den eksisterende matrisen som ble opprettet da jeg la til "Jared”
. Dette er magien til ||=
. I dette tilfellet er «double-pipe equals» – operatøren anerkjent at en karakternøkkel allerede er lagt til og
Hadde min add_student
metode brukt =
i stedet for ||=
, ville jeg ha overskrevet studentoppføringen min "Jared”
da jeg la til en annen student i klasse 9
.