/ / Prosta łamigłówka Ruby o zmiennym odwołaniu w metodzie - ruby

Prosta rubinowa układanka na zmiennej referencji w metodzie - rubin

Dlaczego ta metoda zwraca 1 zamiast umierać z nieskończonej rekurencji?

def foo
foo ||= 1
end

foo # => 1

Przepisano następującą metodę śmierci:

def foo
foo.nil? ? 1 : foo
end

Odpowiedzi:

4 dla odpowiedzi № 1

W pierwszym przypadku, foo ||= 1 odnosi się do zmiennej lokalnej. Ruby zawsze tworzy lokalną zmienną, kiedy wykonujesz przypisanie do gołego słowa, dlatego musisz pisać self.foo = ... jeśli chcesz wywołać metodę zapisu zdefiniowaną jako def foo=(value). The ||= operator jest przecież tylko fantazyjnym operatorem przydziału.

W drugim przypadku nie ma przypisania, więc kiedy trafi foo.nil?Ruby interpretuje to samo słowo foo jako wywołanie metody i wysadza się w powietrze.