operatory Ruby: Podwójna Rura równa się
„Hej, co to||=
oznacza w kodzie ruby?”
w moim pierwszym wpisie na blogu jako programista pomyślałem, że wypadałoby wyjaśnić jedno z pytań, które zadano mi podczas pierwszego dnia w szkole Flatiron. Jest to pytanie, które wymyśliłem około miesiąca temu i które doprowadziło mnie do króliczej nory forów ruby i postów na Reddicie (oszczędzę ci kłopotów i podam kilka lepszych źródeł na dole tego postu).
kontrowersje wokół „double-pipe equals” koncentrują się wokół tego, jak operator powinien być tłumaczony, ale chciałbym skupić ten post na aplikacjach, które znalazłem dla niego. Więc, co dokładnie robi ||=
? Moja własna definicja jest taka, że „double-pipe equals” jest operatorem, który przypisuje wartość, podobnie jak =
lub nasz Klasyczny operator przypisania, ale zakończy przypisanie tylko wtedy, gdy lewa strona naszej operacji zwróci false
lub nil
.
pozwól mi zademonstrować.
a = nil
b = 4
a = b #=> 4
a #=> 4
z a
ustawionym na nil
, łatwo zauważyć, że ustawienie „equal” na b
za pomocą klasycznego operatora przypisania zwróci a o wartości 4
. Ale co, jeśli zamiast tego użyjemy „podwójnej rury równa się”?
a = nil
b = 4
a ||= b #=> 4
a #=> 4
w tym przypadku otrzymujemy ten sam wynik. Gdy a
jest ustawione na nil
(lub cokolwiek, co zwraca wartość false
), operator ||=
działa tak samo, jak =
div > would. Przyjrzyjmy się przykładowi, w którym a
otrzymuje „prawdziwą” wartość.
a = 2
b = 4
a ||= b #=> 2
a #=> 2
w powyższym przykładzie, a zachowuje swoją pierwotną wartość, nawet jeśli została użyta przez nasze „podwójne rury równe”. Dzieje się tak, ponieważ ||
działa w tej metodzie jako „obwód”. Jak wyjaśnia Peter Cooper,
jeśli lewa strona porównania jest prawdziwa, nie ma potrzeby sprawdzania prawej strony.
Kiedy ruby zobaczył, że a
został już przypisany do wartości 2
, przestał wykonywać nasz kod.
gdzie znalazłem tego rodzaju warunkowe przypisanie najbardziej przydatne jest w iteracji. Przejdźmy przez tablicę popularnych owoców, używając naszej metody ||=
, aby przypisać każdy z łańcuchów do a
.
a = nil
array =
array.each do |fruit|
a ||= fruit
end #=> a #=> "apple"
widzimy, że po naszej iteracjia
jest przypisany do pierwszego łańcucha w naszej tablicy,"apple”
. Poa
staje się"apple”
, nasz „Double-pipe equals” nie pozwoli nic na prawo od niego ponownie przypisać naszej zmiennej.
chociaż ruby ma metody, które mogą zwracać pierwszy element tablicy bez iteracji, czasami może być użyteczne kontrolowanie, czy zmienna została przypisana z „prawdziwymi” wartościami. Poniżej znajduje się fragment kodu z jednego z moich ostatnich laboratoriów, w którym znalazłem||=
szczególnie przydatny.
class School attr_reader :roster def initialize(name)
@name = name
@roster = {}
end def add_student(name, grade)
@roster ||=
@roster << name
endend
tutaj zdefiniowałem klasę,School
, wraz z kilkoma metodami. Kluczową rzeczą do zrozumienia jest to, że wywołując roster
na instancji mojej klasy School
, chcę zwrócić moją listę uczniów jako hash ocen wskazujący na tablicę uczniów powiązanych z każdą klasą.
pozwala utworzyć przykładową szkołę i zapełnić niektórych uczniów.
metro = School.new("Metro High")
metro.add_student("Jared", 9)
metro.roster #=> {9=>}metro.add_student("Graham", 9)
metro.roster #=> {9=>}
aby dodać ucznia do roster
mojej instancji School
, muszę przekazać add_student
metoda a name
I grade
. Jednak widzimy, że kiedy dodałem "Graham”
I odpowiadającą mu klasę, 9
, jego nazwa została dodana do istniejącej tablicy, która została utworzona, gdy dodałem "Jared”
. To jest magia ||=
. W tym przypadku operator „double-pipe equals” rozpoznał, że klucz klasy został już dodany i
gdyby moja add_student
zastosowana metoda =
zamiast ||=
, nadpisałbym mój wpis ucznia "Jared”
/div>kiedy dodałem innego ucznia w klasie 9
.