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 № 1W 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.