C ++ erbt echte blaue Operatoren von C. Damit meine ich, dass das "+" in 6 + 4 etwas ganz Besonderes ist. Sie können zum Beispiel keinen Zeiger auf diese + Funktion bekommen.
Scala hingegen hat auf diese Weise keine Operatoren. Es hat nur eine große Flexibilität bei der Definition von Methodennamen und ein wenig Vorrang für Nicht-Wortsymbole. Technisch gesehen hat Scala also keine Bedienerüberlastung.
Wie auch immer Sie es nennen möchten, die Überladung von Operatoren ist selbst in C ++ nicht von Natur aus schlecht. Das Problem ist, wenn schlechte Programmierer es missbrauchen. Aber ehrlich gesagt bin ich der Meinung, dass das Wegnehmen der Fähigkeit von Programmierern, die Überlastung von Operatoren zu missbrauchen, nicht dazu führt, dass alle Dinge repariert werden, die Programmierer missbrauchen können. Die eigentliche Antwort ist Mentoring. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Trotzdem gibt es Unterschiede zwischen der Überladung von C ++ - Operatoren und der flexiblen Methodenbenennung von Scala, die Scala meiner Meinung nach sowohl weniger missbräuchlich als auch missbräuchlicher machen.
In C ++ besteht die einzige Möglichkeit, eine In-Fix-Notation zu erhalten, in der Verwendung von Operatoren. Andernfalls müssen Sie object.message (Argument) oder pointer-> messsage (Argument) oder function (argument1, argument2) verwenden. Wenn Sie also einen bestimmten DSLish-Stil für Ihren Code wünschen, besteht der Druck, Operatoren zu verwenden.
In Scala können Sie bei jeder gesendeten Nachricht eine Infix-Notation erhalten. "Objektnachrichtenargument" ist vollkommen in Ordnung, was bedeutet, dass Sie keine Nicht-Wortsymbole verwenden müssen, um die Infixnotation zu erhalten.
Das Überladen von C ++ - Operatoren ist im Wesentlichen auf die C-Operatoren beschränkt. In Kombination mit der Einschränkung, dass nur Operatoren verwendet werden dürfen, wird ein Infix verwendet, das Druck auf die Benutzer ausübt, zu versuchen, eine Vielzahl von nicht verwandten Konzepten auf relativ wenige Symbole wie "+" und ">>" abzubilden.
Scala erlaubt eine Vielzahl gültiger Nicht-Wortsymbole als Methodennamen. Zum Beispiel habe ich ein eingebettetes Prolog-DSL, in das Sie schreiben können
female('jane)! // jane is female
parent('jane,'john)! // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent
mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female
mother('X, 'john)? // find john's mother
mother('jane, 'X)? // find's all of jane's children
Die Symbole: -,!,? Und & werden als normale Methoden definiert. Nur in C ++ & wäre gültig, sodass ein Versuch, dieses DSL in C ++ abzubilden, einige Symbole erfordern würde, die bereits sehr unterschiedliche Konzepte hervorrufen.
Dies öffnet Scala natürlich auch für eine andere Art von Missbrauch. In Scala können Sie eine Methode $! & ^% Nennen, wenn Sie möchten.
Für andere Sprachen, die wie Scala flexibel in der Verwendung von Nicht-Wort-Funktions- und Methodennamen sind, siehe Smalltalk, wo wie Scala jeder "Operator" nur eine andere Methode und Haskell ist, mit der der Programmierer Vorrang und Fixität von flexibel benannten Namen definieren kann Funktionen.