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å, ata
allerede 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 iterationa
er 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
.