Ich kann mich irren, da niemand es erwähnt hat, aber ich hatte auch den Eindruck, dass der Grund dafür auch das rubinrote Erbe ist, Funktionen ohne Klammern aufrufen zu können.
Arity ist offensichtlich involviert, aber lassen Sie es uns für eine Weile beiseite legen und Funktionen ohne Argumente verwenden. In einer Sprache wie Javascript, in der Klammern obligatorisch sind, ist es einfach, den Unterschied zwischen der Übergabe einer Funktion als Argument und dem Aufruf der Funktion zu unterscheiden. Sie rufen es nur auf, wenn Sie die Klammern verwenden.
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
Wie Sie sehen können, macht es keinen großen Unterschied, ob Sie es benennen oder nicht. Mit Elixier und Rubin können Sie jedoch Funktionen ohne Klammern aufrufen. Dies ist eine Designauswahl, die mir persönlich gefällt, aber sie hat den Nebeneffekt, dass Sie nicht nur den Namen ohne die Klammern verwenden können, da dies bedeuten könnte, dass Sie die Funktion aufrufen möchten. Dafür ist das da &
. Wenn Sie arity appart für eine Sekunde verlassen, &
bedeutet das Voranstellen Ihres Funktionsnamens , dass Sie diese Funktion explizit als Argument verwenden möchten und nicht, was diese Funktion zurückgibt.
Jetzt ist die anonyme Funktion etwas anders, da sie hauptsächlich als Argument verwendet wird. Auch dies ist eine Entwurfsentscheidung, aber das Rationale dahinter ist, dass sie hauptsächlich von Iteratorfunktionen verwendet wird, die Funktionen als Argumente verwenden. Sie müssen sie also offensichtlich nicht verwenden, &
da sie standardmäßig bereits als Argumente betrachtet werden. Es ist ihr Zweck.
Das letzte Problem ist, dass Sie sie manchmal in Ihrem Code aufrufen müssen, weil sie nicht immer mit einer Iteratorfunktion verwendet werden, oder Sie codieren möglicherweise selbst einen Iterator. Da Ruby objektorientiert ist, bestand die Hauptmethode für die kleine Geschichte darin, die call
Methode für das Objekt zu verwenden. Auf diese Weise können Sie das Verhalten der nicht obligatorischen Klammern konsistent halten.
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
Jetzt hat sich jemand eine Verknüpfung ausgedacht, die im Grunde wie eine Methode ohne Namen aussieht.
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
Auch dies ist eine Design-Wahl. Jetzt ist Elixier nicht objektorientiert und ruft daher sicher nicht die erste Form auf. Ich kann nicht für José sprechen, aber es sieht so aus, als ob die zweite Form in Elixier verwendet wurde, da sie immer noch wie ein Funktionsaufruf mit einem zusätzlichen Zeichen aussieht. Es ist nah genug an einem Funktionsaufruf.
Ich habe nicht über alle Vor- und Nachteile nachgedacht, aber es sieht so aus, als könnten Sie in beiden Sprachen nur mit den Klammern davonkommen, solange Sie Klammern für anonyme Funktionen obligatorisch machen. Es scheint so zu sein:
Obligatorische Klammern VS Etwas andere Notation
In beiden Fällen machen Sie eine Ausnahme, weil sich beide unterschiedlich verhalten. Da es einen Unterschied gibt, können Sie ihn genauso gut deutlich machen und sich für die andere Notation entscheiden. Die obligatorischen Klammern sehen in den meisten Fällen natürlich aus, sind aber sehr verwirrend, wenn die Dinge nicht wie geplant verlaufen.
Bitte schön. Dies ist möglicherweise nicht die beste Erklärung der Welt, da ich die meisten Details vereinfacht habe. Das meiste davon sind auch Designentscheidungen, und ich habe versucht, einen Grund dafür anzugeben, ohne sie zu beurteilen. Ich liebe Elixier, ich liebe Rubin, ich mag die Funktionsaufrufe ohne Klammern, aber wie Sie finde ich die Konsequenzen hin und wieder ziemlich irreführend.
Und in Elixier ist es nur dieser zusätzliche Punkt, während in Rubin Blöcke darüber liegen. Blöcke sind erstaunlich und ich bin überrascht, wie viel Sie mit nur Blöcken tun können, aber sie funktionieren nur, wenn Sie nur eine anonyme Funktion benötigen, die das letzte Argument ist. Da Sie dann in der Lage sein sollten, mit anderen Szenarien umzugehen, kommt hier die gesamte Methode / Lambda / Proc / Block-Verwirrung.
Wie auch immer ... das ist nicht möglich.