Methodenaufrufe können in der Regel den Empfänger und die Klammern für die Argumente wegzulassen:Warum muss ein Methodenaufruf disambiguiert werden, wenn er im Prinzip konstant sein kann?
def foo; "foo" end
foo # => "foo"
Im obigen Fall ist foo
mehrdeutig zwischen Methodenaufruf und Bezugnahme auf eine mögliche lokale Variable. In Ermangelung letzterer wird es als Methodenaufruf interpretiert.
Wenn jedoch der Methodenname im Prinzip ein konstanter Name sein kann (d. H. Wenn er mit einem Großbuchstaben beginnt und nur aus Buchstaben besteht), scheint es eine Disambiguierung zu erfordern.
def Foo; "Foo" end
Foo # => NameError: uninitialized constant Foo
Foo() # => "Foo"
self.Foo # => "Foo"
Warum ist das der Fall? Warum muss ein Methodenaufruf explizit von einer Referenz auf eine Konstante unterschieden werden, auch wenn eine Konstante mit demselben Namen fehlt?
Danke für die Antwort. – sawa
Die Tatsache, dass lokale Variablen zum Zeitpunkt der Analyse definiert sind, ist der Grund für das etwas unintuitive Verhalten von 'if false though foo = 43 end; foo # => nil (anstelle von NameError) '. –
@ JörgWMittag Das macht Sinn. –