Ruby Operators: Double Pipe is gelijk aan
” Hey, wat betekent dat ||=
betekent in uw ruby code?”
in mijn eerste blog post als programmeur, dacht ik dat het gepast zou zijn om een van de vragen uit te leggen die mij werd gesteld tijdens mijn eerste dag op Flatiron School. Dit is een vraag die ik ongeveer een maand geleden was gekomen en een die me naar beneden leidde een konijnenhol van ruby forums en reddit berichten (Ik zal u de moeite besparen en een paar van de betere bronnen aan de onderkant van dit bericht koppelen).
De controverse achter “double-pipe is gelijk aan” is gecentreerd rond hoe de operator moet worden vertaald, maar Ik wil dit bericht richten op de toepassingen die ik heb gevonden voor het. Dus, wat doet ||=
precies? Mijn eigen definitie is dat “double-pipe is gelijk aan”een operator is die een waarde toewijst, net als =
of onze klassieke toewijzings-operator, maar de toewijzing alleen zal voltooien als de linkerkant van onze operatie false
of nil
retourneert.
laat me het demonstreren.
a = nil
b = 4
a = b #=> 4
a #=> 4
met a
ingesteld op nil
, is het gemakkelijk te zien dat het instellen van een “gelijk” aan b
met behulp van de klassieke toewijzings-operator a zou retourneren met de waarde van 4
. Maar wat als we “double-pipe gelijken” in plaats daarvan gebruiken?
a = nil
b = 4
a ||= b #=> 4
a #=> 4
In dit geval krijgen we hetzelfde resultaat. Als a
is ingesteld op nil
(of iets dat evalueert naar false
), werkt de ||=
operator hetzelfde als =
. Laten we eens kijken naar een voorbeeld waar a
een “truthy” waarde wordt gegeven.
a = 2
b = 4
a ||= b #=> 2
a #=> 2
in het voorbeeld hierboven behoudt a zijn oorspronkelijke waarde, ook al is het bediend via onze”double-pipe is gelijk aan”. Dit gebeurt omdat de ||
fungeert als een” circuit ” in deze methode. Zoals Peter Cooper uitlegt,
als de linkerkant van de vergelijking waar is, is het niet nodig om de rechterkant te controleren.
toen ruby zag dat a
al was toegewezen aan de waarde van 2
, stopte het uitvoeren van onze code.
waar ik dit soort voorwaardelijke toewijzing het meest nuttig heb gevonden is in iteratie. Laten we herhalen door een reeks populaire vruchten, met behulp van onze ||=
methode om elk van de strings toe te wijzen aan a
.
a = nil
array =
array.each do |fruit|
a ||= fruit
end #=> a #=> "apple"
We kunnen zien dat, na onze iteratie, a
is toegewezen aan de eerste tekenreeks in onze array, "apple”
. Nadat a
wordt "apple”
, zal onze” double-pipe is gelijk aan ” niet toestaan dat iets rechts ervan onze variabele opnieuw toewijst.
hoewel ruby methoden heeft die het eerste element van een array kunnen retourneren zonder iteratie, kan het soms nuttig zijn om te bepalen of een variabele al dan niet is toegewezen met een “truthy” waarde. Hieronder is een codefragment van een van mijn recente labs waar ik ||=
bijzonder nuttig vond.
class School attr_reader :roster def initialize(name)
@name = name
@roster = {}
end def add_student(name, grade)
@roster ||=
@roster << name
endend
Hier heb ik een klasse gedefinieerd, School
, samen met een paar methoden. Het belangrijkste om te begrijpen is dat door roster
aan te roepen op een instantie van mijn School
Klasse, ik op zoek ben om mijn lijst met studenten terug te geven als een hash van cijfers die wijzen naar een reeks studenten die aan elke graad zijn gekoppeld.
laat instantiate een voorbeeld school en bevolken sommige studenten.
metro = School.new("Metro High")
metro.add_student("Jared", 9)
metro.roster #=> {9=>}metro.add_student("Graham", 9)
metro.roster #=> {9=>}
om een student toe te voegen aan de roster
van mijn School
instantie, moet ik de add_student
methode a name
en a grade
. We kunnen echter zien dat toen ik "Graham”
en zijn overeenkomstige rang, 9
, Zijn naam werd toegevoegd aan de bestaande array die werd gemaakt toen ik "Jared”
voegde. Dit is de magie van ||=
. In dit geval, de “dubbele buis is gelijk aan” operator erkend dat een cijfer sleutel is al toegevoegd en
mijn add_student
methode =
in plaats van ||=
, Ik zou overschreven mijn student item "Jared”
toen ik nog een andere leerling in de klas 9
.