C ++ hérite des véritables opérateurs bleus de C. J'entends par là que le "+" en 6 + 4 est très spécial. Vous ne pouvez pas, par exemple, obtenir un pointeur vers cette fonction +.
Scala, en revanche, n'a pas d'opérateurs de cette manière. Il a juste une grande flexibilité dans la définition des noms de méthode et un peu de priorité intégrée pour les symboles non-mot. Donc, techniquement, Scala n'a pas de surcharge d'opérateurs.
Quoi que vous vouliez l'appeler, la surcharge d'opérateurs n'est pas intrinsèquement mauvaise, même en C ++. Le problème est que les mauvais programmeurs en abusent. Mais franchement, je suis d'avis que priver les programmeurs de la capacité d'abuser de la surcharge des opérateurs ne met pas une goutte dans le seau de réparer toutes les choses dont les programmeurs peuvent abuser. La vraie réponse est le mentorat. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Néanmoins, il existe des différences entre la surcharge d'opérateurs de C ++ et la dénomination de méthode flexible de Scala qui, à mon humble avis, rend Scala à la fois moins abusable et plus abusable.
En C ++, le seul moyen d'obtenir une notation in-fix est d'utiliser des opérateurs. Sinon, vous devez utiliser object.message (argument) ou pointer-> messsage (argument) ou function (argument1, argument2). Donc, si vous voulez un certain style DSL pour votre code, il y a une pression pour utiliser des opérateurs.
Dans Scala, vous pouvez obtenir une notation infixe avec n'importe quel message envoyé. "object message argument" est parfaitement correct, ce qui signifie que vous n'avez pas besoin d'utiliser des symboles non-mot juste pour obtenir la notation infixe.
La surcharge des opérateurs C ++ est essentiellement limitée aux opérateurs C. Combiné avec la limitation que seuls les opérateurs peuvent être utilisés infixe qui met la pression sur les gens pour essayer de mapper un large éventail de concepts non liés sur un nombre relativement limité de symboles comme "+" et ">>"
Scala autorise une vaste gamme de symboles valides sans mots comme noms de méthode. Par exemple, j'ai un DSL Prolog-ish intégré où vous pouvez écrire
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
Les symboles: -,!,? Et & sont définis comme des méthodes ordinaires. En C ++ seulement & serait valide donc une tentative de mapper ce DSL en C ++ nécessiterait des symboles qui évoquent déjà des concepts très différents.
Bien sûr, cela ouvre également Scala à un autre type d'abus. Dans Scala, vous pouvez nommer une méthode $! & ^% Si vous le souhaitez.
Pour d'autres langages qui, comme Scala, sont flexibles dans l'utilisation de fonctions et de noms de méthodes non-mot, voir Smalltalk où, comme Scala, chaque "opérateur" est juste une autre méthode et Haskell qui permet au programmeur de définir la priorité et la fixité des noms flexibles les fonctions.