Articles

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 .