Articles

Ruby operátory: Double Pipe se rovná

„Hej, co to znamená ||= ve vašem ruby kódu?“

ve svém prvním blogu jako programátor jsem si myslel, že by bylo vhodné vysvětlit jednu z otázek, které mi byly položeny během prvního dne ve škole Flatiron. To je otázka, že jsem měl přijít před měsícem, a ten, který mě vedl dolů králičí díry ruby fóra a reddit příspěvky (ušetřím vám námahu a propojit některé lepší zdroje ve spodní části tohoto příspěvku).

diskuse za „double-pipe equals“ je soustředěna kolem toho, jak by měl být operátor přeložen, ale chtěl bych tento příspěvek zaměřit na aplikace, které jsem pro něj našel. Takže, co přesně dělá ||=? Moje definice je, že „double-pipe rovná se“ je operátor, který přiřadí hodnotu, stejně jako = nebo klasický operátor přiřazení, ale pouze dokončit úkol, když na levé straně naší činnosti výnosy false nebo nil.

dovolte mi ukázat.

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

anil, to je snadné vidět, že nastavení „rovného“ do b pomocí klasické přiřazovací operátor vrátí s hodnotou 4. Ale co kdybychom místo toho použili „double-pipe equals“?

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

v tomto případě získáme stejný výsledek. Když a je nastavena na nil (nebo cokoliv, co se hodnotí, aby false||= operátor funguje stejně jako =. Podívejme se na příklad, kde a má hodnotu“ pravda“.

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

ve výše uvedeném příkladu si a zachovává svou původní hodnotu, i když byla provozována prostřednictvím našeho „double-pipe equals“. K tomu dochází, protože || funguje v této metodě jako“ obvod“. Jak vysvětluje Peter Cooper,

Pokud je levá strana srovnání pravdivá, není třeba kontrolovat pravou stranu.

Když se ruby viděli, že a byla již přiřazena hodnota 2, zastavit provádění kódu.

kde jsem našel tento druh podmíněného přiřazení nejužitečnější je v iteraci. Pojďme iterovat přes pole populárních plodů, pomocí naší metody ||= přiřadit každý z řetězců a.

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

vidíme, že po naší iteraci je a přiřazen prvnímu řetězci v našem poli, "apple” . Po a se stane "apple”, naše“ double-pipe equals “ nedovolí nic napravo od ní znovu přiřadit naši proměnnou.

Zatímco ruby má metody, které může vrátit na první prvek pole bez iterace, může být někdy užitečné pro kontrolu, zda je či není proměnné byla přiřazena s „upřímná“ hodnotu. Níže je úryvek kódu z jedné z mých nedávných laboratoří, kde jsem našel ||= zvláště užitečné.

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

Zde jsem definoval třídu, School, spolu s několika metod. Hlavní věc je pochopit, že tím, že volá roster instance School třídu, těším se na návrat můj seznam studentů jako hash známky ukazující na pole studentů spojené s každou třídu.

umožňuje vytvořit příklad školy a naplnit některé studenty.

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

přidat studenta do rosterSchool instance, musím projít add_student metoda namegrade. Nicméně, můžeme vidět, že když jsem přidal "Graham” a jeho odpovídající třídě, 9, jeho jméno bylo přidáno do existující pole, který byl vytvořen, když jsem přidal "Jared”. Toto je kouzlo ||=. V tomto případě, „double-pipe rovno“ operátor uznal, že stupeň klíčem již byl přidán a

moje add_student použité metody = místo ||=, Já bych přepsán můj student zápis "Jared” když jsem přidal další student ve třídě 9 .