Warum ist nicht der Ruby 1.9 Lambda-Aufruf möglich ohne den Punkt vor den Klammern?
-
18-09-2019 - |
Frage
überprüfte ich die neueste Ruby-Version aus, ein wenig mit den neuesten Änderungen zu spielen. Das erste, was ich versuchte, war zu tun, um eine Lambda / Block / proc Rubin nennen wie Sie mit einem Python tun würden aufrufbar.
a = lambda {|x| puts x}
a.call(4) # works, and prints 4
a[4] # works and prints 4
a.(4) # same
a(4) # undefined method 'a' for main:Object
Warum ist nicht der letzte Anruf möglich? Wird es jemals sein?
Lösung
AFAIK ist es, weil Rubin Sie die ()
Methode nicht lassen für ein Objekt definieren. Der Grund, es nicht lassen Sie die ()
Methode definieren, ist wahrscheinlich aufgrund der Tatsache, dass Klammern in Methodenaufrufe sind optional.
Und für das, was es wert ist, ist hier ein Hack Sie lambdas aufrufen lassen ()
mit
Andere Tipps
Ruby ist grundsätzlich 100% objektorientiert, aber manchmal versucht, diese Tatsache zu verbergen, für ... Bequemlichkeit? Vertrautheit?
Grundsätzlich Funktionen definiert „auf der obersten Ebene“ sind wirklich als Methoden, die auf einem globalen Objekt definiert. Um diese Arbeit zu machen, wird ein Anruf ohne Spezifizierer wirklich konvertiert eine Methode mit diesem Namen zu nennen auf dem globale Objekt. Dieser Stil macht die Dinge mehr Skript-y suchen. Ruby versucht, dass mit dem letzten Beispiel zu tun.
Die ersten beiden Beispiele analysieren in Ordnung, weil Rubin kennt man die Methoden des proc-Objekt zuzugreifen versuchen - auch nicht vergessen, []
nur eine Methode ist, können Sie definieren. Der mit dem expliziten Punkt funktioniert auch, weil der Punkt bedeutet „diese Nachricht an dieses Objekt senden“ (in diesem Fall a
).
Ich weiß, dass nicht „lösen“ nichts, aber ich hoffe, es hilft ein wenig.