chiamate metodo possono generalmente omettere il ricevitore e le parentesi per gli argomenti:Perché una chiamata al metodo deve essere disambiguita quando in linea di principio può essere una costante?
def foo; "foo" end
foo # => "foo"
Nel caso precedente, foo
è ambigua tra il metodo di chiamata e riferimento ad un potenziale variabile locale. In assenza di quest'ultimo, viene interpretato come una chiamata al metodo.
Tuttavia, quando il nome del metodo può in linea di principio essere un nome costante (vale a dire, quando inizia con una lettera maiuscola e consiste solo di lettere), sembra che sia necessario chiarire le ambiguità.
def Foo; "Foo" end
Foo # => NameError: uninitialized constant Foo
Foo() # => "Foo"
self.Foo # => "Foo"
Perché è questo il caso? Perché una chiamata al metodo deve essere esplicitamente distinta da un riferimento a una costante anche in assenza di una costante con lo stesso nome?
Grazie per la risposta. – sawa
Il fatto che le variabili locali siano definite in fase di analisi è la ragione del comportamento un po 'non intuitivo di "if false then foo = 43 end; foo # => nil (invece di NameError) '. –
@ JörgWMittag Questo ha perfettamente senso. –