Ruby operátorok: dupla cső egyenlő
“Hé, mit jelent ez a ||=
A ruby kódban?”
programozóként az első blogbejegyzésemben úgy gondoltam, hogy helyénvaló lenne elmagyarázni az egyik kérdést, amelyet a Flatiron iskolában töltött első napom során feltettek nekem. Ez egy olyan kérdés, amelyet körülbelül egy hónappal ezelőtt felvetettem, és amely a ruby fórumok és a reddit bejegyzések nyúllyukán vezetett le (megmentem a bajt, és összekapcsolom néhány jobb forrást a bejegyzés alján).
a vita mögött “double-pipe equals” köré, hogy az Üzemeltető kell fordítani, de szeretném összpontosítani ezt a bejegyzést az alkalmazásokat, hogy találtam rá. Tehát pontosan mit csinál a ||=
? Saját definícióm szerint a “double-pipe equals”egy olyan operátor, amely értéket rendel hozzá, hasonlóan a =
vagy a klasszikus hozzárendelési operátorunkhoz, de csak akkor fejezi be a hozzárendelést, ha a művelet bal oldala visszaadja false
vagy nil
.
hadd mutassam be.
a = nil
b = 4
a = b #=> 4
a #=> 4
a a
beállítása nil
könnyen belátható, hogy az “egyenlő” beállítása b
a klasszikus hozzárendelési operátor használatával a értéke a
4
. De mi lenne, ha inkább a “kettős cső egyenlő”-et használnánk?
a = nil
b = 4
a ||= b #=> 4
a #=> 4
ebben az esetben ugyanazt az eredményt kapjuk. Ha a a
értéke nil
(vagy bármi, ami a false
értékre van állítva), akkor a ||=
operátor ugyanúgy működik, mint a =
lenne. Nézzünk meg egy példát, ahol a a
” truthy ” értéket kap.
a = 2
b = 4
a ||= b #=> 2
a #=> 2
a fenti példában az A megtartja eredeti értékét, annak ellenére, hogy a “kettős csöves egyenlőségünkön”keresztül működött. Ez azért történik, mert a ||
ebben a módszerben “áramkörként” működik. Ahogy Peter Cooper elmagyarázza,
Ha az összehasonlítás bal oldala igaz, akkor nem kell ellenőrizni a jobb oldalt.
amikor ruby látta, hogy aa
már hozzá van rendelve a2
értékéhez, abbahagyta a kód futtatását.
ahol ezt a feltételes hozzárendelést találtam a leghasznosabbnak az iterációban. Nézzük végig egy sor népszerű gyümölcsök, a mi ||=
módszer rendelni az egyes húrok a
.
a = nil
array =
array.each do |fruit|
a ||= fruit
end #=> a #=> "apple"
láthatjuk, hogy az iteráció utána
a tömb első karakterláncához van rendelve,"apple”
. Miután a
válik "apple”
, a” kettős cső egyenlő ” nem hagyja, hogy semmit a jobb oldali átrendezheti a változó.
míg a ruby olyan módszerekkel rendelkezik, amelyek iteráció nélkül visszaadhatják a tömb első elemét, néha hasznos lehet annak ellenőrzése, hogy egy változót “truthy” értékkel rendeltek-e hozzá. Az alábbiakban egy kódrészlet található az egyik legutóbbi laboratóriumomból, ahol a ||=
különösen hasznosnak találtam.
class School attr_reader :roster def initialize(name)
@name = name
@roster = {}
end def add_student(name, grade)
@roster ||=
@roster << name
endend
itt definiáltam egy osztályt,School
, néhány módszerrel együtt. A legfontosabb dolog, amit meg kell érteni, hogy a roster
meghívásával a School
osztály egyik példányán vissza szeretném adni a hallgatók listáját, mint az osztályzatok kivonatát, amely az egyes osztályokhoz társított hallgatók tömbjére mutat.
lehetővé teszi egy példa iskola példányosítását és néhány diák feltöltését.
metro = School.new("Metro High")
metro.add_student("Jared", 9)
metro.roster #=> {9=>}metro.add_student("Graham", 9)
metro.roster #=> {9=>}
diák hozzáadásához a roster
az én School
példány, át kell adnom a add_student
módszer a name
és a grade
. Azonban láthatjuk, hogy amikor hozzáadtam a"Graham”
és a megfelelő osztályzatot,9
, a nevét hozzáadták a meglévő tömbhöz, amelyet a"Jared”
hozzáadásakor hoztak létre. Ez a ||=
varázsa. Ebben az esetben a “double-pipe equals” operátor felismerte, hogy egy osztálykulcs már hozzá lett adva, és
Ha a add_student
módszert alkalmaztam volna =
a ||=
helyett felülírtam volna a diákbejegyzésemet "Jared”
amikor felvettem egy másik tanulót az osztályba 9
.