Articles

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 a4. 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 aamá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ánaa tömb első karakterláncához van rendelve,"apple”. Miután avá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 .