Articles

Ruby Operators: Double Pipe er lig med

” Hej, hvad betyder det ||= i din ruby-kode?”

i mit første blogindlæg som programmør tænkte jeg, at det ville være passende at forklare et af de spørgsmål, jeg blev stillet i løbet af min første dag på Flatiron School. Dette er et spørgsmål, som jeg var kommet op for omkring en måned siden, og et, der førte mig ned i et kaninhul med ruby-fora og reddit-indlæg (Jeg sparer dig besværet og linker et par af de bedre kilder i bunden af dette indlæg).

kontroversen bag “double-pipe lig” er centreret omkring, hvordan operatøren skal oversættes, men jeg vil gerne fokusere dette indlæg på de applikationer, jeg har fundet til det. Så hvad gør ||=? Min egen definition er ,at” double-pipe lig”er en operatør, der tildeler en værdi, ligesom = eller vores klassiske opgaveoperatør, men vil kun fuldføre opgaven, hvis venstre side af vores operation returnerer false eller nil.

lad mig demonstrere.

a = nil
b = 4
a = b #=> 4
a #=> 4

med a Indstil til nil, det er let at se, at Indstilling af en “lige” til b brug af den klassiske opgaveoperatør ville returnere a med værdien af 4. Men hvad nu hvis vi brugte “double-pipe lig” i stedet?

a = nil
b = 4
a ||= b #=> 4
a #=> 4

i dette tilfælde får vi det samme resultat. Når a er indstillet til nil (eller noget, der evaluerer til false), fungerer ||= operator det samme som = ville. Lad os se på et eksempel, hvor a får en “sand” værdi.

a = 2
b = 4
a ||= b #=> 2
a #=> 2

i eksemplet ovenfor bevarer a sin oprindelige værdi, selvom den er blevet betjent gennem vores “dobbeltrør lig med”. Dette sker, fordi || fungerer som et “kredsløb” i denne metode. Som Peter Cooper forklarer,

Hvis venstre side af sammenligningen er sand, er der ingen grund til at kontrollere højre side.

da ruby så, ataallerede var tildelt værdien af2, stoppede den med at udføre vores kode.

hvor jeg har fundet denne form for betinget opgave mest nyttig er i iteration. Lad os gentage gennem en række populære frugter ved hjælp af vores ||= metode til at tildele hver af strengene til a.

a = nil
array =
array.each do |fruit|
a ||= fruit
end #=> a #=> "apple"

Vi kan se, at efter vores iterationaer tildelt den første streng i vores array,"apple”. Eftera bliver"apple”, vil vores “dobbeltrør lig med” ikke lade noget til højre for det omfordele vores variabel.

mens ruby har metoder, der kan returnere det første element i et array uden iteration, kan det undertiden være nyttigt at kontrollere, om en variabel er tildelt en “sand” værdi eller ej. Nedenfor er et kodestykke fra et af mine seneste laboratorier, hvor jeg fandt ||= særligt nyttigt.

class School attr_reader :roster def initialize(name) 
@name = name
@roster = {}
end def add_student(name, grade)
@roster ||=
@roster << name
endend

Her har jeg defineret en klasse, School sammen med et par metoder. Den vigtigste ting at forstå er, at ved at kalde roster på en forekomst af min School klasse, Jeg ønsker at returnere min liste over studerende som en hash af karakterer, der peger på en række studerende tilknyttet hver klasse.

lader instantiere et eksempel skole og befolke nogle studerende.

metro = School.new("Metro High")
metro.add_student("Jared", 9)
metro.roster #=> {9=>}metro.add_student("Graham", 9)
metro.roster #=> {9=>}

for at tilføje en studerende til roster af min School instans, jeg skal passere add_student metode a name og a grade. Vi kan dog se, at når jeg tilføjede "Graham” og hans tilsvarende karakter, 9, blev hans navn tilføjet til det eksisterende array, der blev oprettet, da jeg tilføjede "Jared”. Dette er magien af ||=. I dette tilfælde erkendte operatøren “double-pipe lig”, at der allerede er tilføjet en karakternøgle, og

havde min add_student anvendt metode = i stedet for ||=, jeg ville have overskrevet min studieindgang "Jared” da jeg tilføjede en anden studerende i lønklasse 9 .