Proc # -Aufruf
Betrachten Sie beispielsweise die Funktionen "add" und "sum", die die Summe zweier Argumente ausgeben. Mit Python und JavaScript können Sie Code wie folgt schreiben:
python
def add(x, y):
print(x + y)
sum = add #Kann so ersetzt werden, wie es ist
add(1, 2)
sum(1, 2) #Es gibt keinen Unterschied, wie add und sum aufgerufen werden
JavaScript
function add(x, y){
console.log(x + y);
}
sum = add //Kann so ersetzt werden, wie es ist
add(1, 2)
sum(1, 2) //Es gibt keinen Unterschied, wie add und sum aufgerufen werden
In Ruby können Sie eine Methode jedoch keiner anderen Variablen zuweisen. Sie müssen ein Proc-Objekt mit proc oder lambda erstellen und dann übergeben, und der Empfänger leitet auch den Aufruf weiter. Sie müssen es nennen. Dies gilt auch für Java, wo Sie die Methode "apply" aufrufen müssen.
Ruby
def add(x, y)
puts (x + y)
end
sum = proc{|x, y| add(x, y)} #Müssen in Proc oder Lambda wickeln
add 1, 2
sum.call 1, 2 #Es ist notwendig, mit Anruf anzurufen, und die Verwendung von add und sum ist unterschiedlich.
Ich verstehe, das ist nicht gut. Auf der Ruby-Seite gibt es jedoch ein Gegenargument, und Ruby hat den Vorteil, dass Klammern in Methodenaufrufen weggelassen werden können, wenn keine Argumente vorhanden sind.
JavaScript
function answer(){
console.log(42)
}
answer() //Es gibt Klammern
Ruby
def answer
puts 42
end
answer #Ich brauche keine Klammern
Ich finde es auch etwas klobig und umständlich zu handhaben. Aber wie der Text sagt, ist dies ein Kompromiss mit dem einzigartigen Stil, der Ruby einen Mehrwert verleiht.
Der Versuch, solche Abkürzungen in JavaScript oder Python einzuführen, ist nicht möglich, da dies im Widerspruch zur Syntax steht, die das Funktionsobjekt selbst darstellt. Deshalb kann ich, soweit ich sehen kann, nicht sagen, welches besser ist ...
Haskell / PureScript löst dieses Dilemma.
PureScript
add x y = logShow (x + y) --add hat ein Argument
sum = add --Funktionen sind erstklassig, sodass Sie sie normal zuweisen können
answer = logShow 42 --Antwort hat keine Argumente
fortyTwo = answer --Da der Wert der Antwort ebenfalls erstklassig ist, können Sie ihn so wie er ist einer anderen Variablen zuweisen.
main = do
add 1 2 --3 wird ausgegeben. Natürlich können Sie es normal nennen, wenn es ein Argument gibt
sum 1 2 --3 wird ausgegeben. Es gibt keinen Unterschied, wie add und sum aufgerufen wird
answer --42 wird ausgegeben. Natürlich gibt es keine Klammern, auch wenn es keine Argumente gibt
fortyTwo --42 wird ausgegeben. Weil zweiundvierzig und Antwort sich auf dasselbe beziehen.
Es gibt zwei Vorteile: Rubys "Funktionsaufruf ohne Argument kann Klammern weglassen" und Python / JavaScript "normaler Funktionsaufruf und Funktionsobjektaufruf werden nicht unterschieden". Geheimnisvoll! Es kann interessant sein, selbst zu überlegen, warum Haskell / PureScript dies kann, was jeder Teil des obigen Codes bedeutet und in welcher Reihenfolge die Ausführung fortgesetzt wird [^ sample].
[^ sample]: Ich glaube jedoch nicht, dass jemand, der Haskell / PureScript nicht kennt, es wissen wird. Da es sich um PureScript-Code handelt, ist Haskells eindeutige Transformationsspezifikation "Delay Evaluation", die die Ausführungsreihenfolge durcheinander bringt, irrelevant.
Wenn Sie sich den obigen PureScript-Code genau ansehen, gibt es keine Punkte, keine Doppelpunkte und sogar ein Komma. Das einzige reservierte Wort ist "do", das den Beginn des Codeblocks signalisiert. Sie können sehen, dass der Code seltsamerweise erfrischend aussieht, z. B. wenn der Block durch Einrückungen wie Python dargestellt wird. Dies ist auch eine Funktion des Haskell / PureScript-Codes. Das syntaktische Rauschen ist bis an die Grenze eingegrenzt und ich denke, es ist sehr leicht zu lesen, aber aus irgendeinem Grund wird manchmal gesagt, dass es schwer zu lesen ist.
Dies ist ein grammatikalisches Problem. Vielleicht wird in Zukunft eine Sprache mit einer Grammatik entwickelt, die diese ausgleicht.
Es gibt es seit über 15 Jahren. Es ist nicht bekannt, weil es zu wenige Leute gibt, die es benutzen ...
Viele Ruby-Benutzer mögen einen solchen syntaktischen Overhead möglicherweise nicht, z. B. den Versuch, Klammern wegzulassen, wenn keine Argumente vorhanden sind. Haskell / PureScript hat eine einfache Syntax, daher denke ich, dass es für Leute geeignet ist, die Ruby mögen. Diese Details interessieren mich nicht wirklich, aber ich denke normalerweise, dass es aus Gründen der Konsistenz praktisch ist, synchrone und asynchrone Aktionen mit Monaden zu abstrahieren. Um die Vorteile zu erklären: "Ich weiß nicht, was es bedeutet. Dieses Mal erklärte ich so kurz wie möglich den leicht verständlichen Punkt, dass "Bequemlichkeit und Einfachheit mit dem Vorhandensein oder Fehlen von Funktionsargumenten vereinbar sind und ob sie erstklassig sind".