Warum ist die `unary_ " - Präfix benötigt in scala?
Anfänger Scala Frage, aber ich konnte nicht finden die Antwort hier.
Ähnlich überladen in C++, ich würde erwarten, dass der compiler kann sagen, der Unterschied zwischen einer Methode namens -
nimmt einen parameter (mit dem gleichen Typ wie die Klasse) und die unären version von -
die keine Parameter hat, also warum ist unary_
benötigt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
unary_
Präfix für unäre Präfix-Operatoren ist ein wenig irreführend: es geht mehr um die Präfix Teil als die unäre Teil. Benötigen Sie eine Möglichkeit, zu unterscheiden,vom
Denken Sie daran: Scala tatsächlich nicht die Betreiber. Es gibt zwei Möglichkeiten zum aufrufen einer Methode, entweder mit einem
.
oder mit Leerzeichen:Und wenn Sie haben, ein einzelnes argument, Sie können lassen Sie die Klammern:
Schließlich (fast) alle Charakter ist legal in einem identifier:
Nun sieht wie das Scala hat ein binärer infix -
+
Betreiber, aber es eigentlich gar nicht. Es ist nur eine normale Methode aufgerufen, mit der normalen Methode aufrufen syntax.Was ich oben sagte ist nicht voll wahr, jedoch. Wenn die Scala hat keine Unterstützung für die Operatoren und es war alles nur normale Methode aufrufen, dann
bewerten würde um die 20 (wie in Smalltalk Selbst und Neusprech zum Beispiel) anstelle von 14. Also, es ist eine wenig bit-Unterstützung für Operatoren in Scala (zwei kleine Stückchen, eigentlich). Wenn eine Methode aufgerufen wird mit Leerzeichen (sogenannten "operator-syntax") anstelle der
.
, und die Methode beginnt mit einem operator-Zeichen, dann Scala respektieren Rangfolge.Und die anderen wenig-operator-Unterstützung ist, dass es einige Operatoren, die Sie würde wie zu haben, aber das ist nicht einfach, ausgedrückt als eine Methode aufrufen. Es funktioniert gut für binäre infix-Operatoren und unären postfix-Operatoren:
Aber nicht für "Präfix" oder "rund-um-fix" - Betreiber:
So, es gibt ein paar spezielle syntaktische Zucker-übersetzung-Regeln:
Und der Grund, warum es muss ein Unterstrich zwischen dem alphanumerischen und dem "operator" - Teil im Namen einer Methode ist, weil Sie nicht weiß, ob
bedeutet
oder
So
foo!
als den Namen einer Methode ist illegal, es muss aufgerufen werdenfoo_!
.(2.) + (3.) * (4)
. Sie sollten eine deprecation-Warnung, obwohl; float Literale ohne Dezimalstellen sind veraltet und werden entfernt in späteren Versionen.Da in scala ist es völlig in Ordnung, erstellen Sie eine Methode mit dem Namen
-
, das braucht keine Argumente. Wie würden Sie unterscheiden zwischen einer normalen und einer einfachen Methode? Zum Beispiel!
hat eine ganz andere Bedeutung als einfach, als als post-Update-operator.!x
undx!
beide gerade genannt!
und nehmen keine weiteren Parameter und der compiler weiß, dass es zwei verschiedene Funktionen? Auch er wird wissen, was man zu nennen, weil es vor oder nach dem Objekt?