wywołuje metodę można zwykle pominąć odbiornik i nawiasy dla argumentów:Dlaczego wywołanie metody musi zostać ujednoznacznione, skoro może w zasadzie być stałą?
def foo; "foo" end
foo # => "foo"
W powyższym przypadku, foo
jest niejednoznaczna między wywołania metody oraz odniesienie do potencjalnego zmiennej lokalnej. W przypadku braku tej ostatniej jest interpretowany jako wywołanie metody.
Jednak, gdy nazwa metody może w zasadzie być nazwą stałą (tj. Gdy zaczyna się od dużej litery i składa się tylko z liter), wydaje się, że potrzebna jest ujednoznacznienie.
def Foo; "Foo" end
Foo # => NameError: uninitialized constant Foo
Foo() # => "Foo"
self.Foo # => "Foo"
Dlaczego tak się dzieje? Dlaczego wywołanie metody musi być jawnie odróżnione od odwołania do stałej nawet pod nieobecność stałej o tej samej nazwie?
Dzięki za odpowiedź. – sawa
Fakt, że zmienne lokalne są zdefiniowane w czasie parowania, jest przyczyną nieco nieintuicyjnego zachowania 'if false then foo = 43 end; foo # => zero (zamiast NameError) '. –
@ JörgWMittag To ma sens. –