C ++ hereda verdaderos operadores azules de C. Con eso quiero decir que el "+" en 6 + 4 es muy especial. No puede, por ejemplo, obtener un puntero a esa función +.
Scala, por otro lado, no tiene operadores de esa manera. Simplemente tiene una gran flexibilidad para definir nombres de métodos más un poco de precedencia incorporada para símbolos que no son palabras. Así que técnicamente Scala no tiene sobrecarga del operador.
Como quiera llamarlo, la sobrecarga del operador no es inherentemente mala, incluso en C ++. El problema es cuando los malos programadores lo abusan. Pero, francamente, soy de la opinión de que eliminar la capacidad de los programadores de abusar de la sobrecarga del operador no pone una gota en el balde de arreglar todo lo que los programadores pueden abusar. La verdadera respuesta es la tutoría. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Sin embargo, existen diferencias entre la sobrecarga del operador de C ++ y la denominación de métodos flexibles de Scala que, en mi humilde opinión, hacen que Scala sea menos abusivo y más abusivo.
En C ++, la única forma de obtener la notación en corrección es utilizando operadores. De lo contrario, debe usar object.message (argumento) o puntero-> messsage (argumento) o función (argumento1, argumento2). Entonces, si desea un cierto estilo DSLish para su código, entonces hay presión para usar operadores.
En Scala puede obtener notación infija con cualquier mensaje enviado. "argumento de mensaje de objeto" está perfectamente bien, lo que significa que no necesita usar símbolos que no sean palabras solo para obtener la notación infija.
La sobrecarga del operador C ++ se limita esencialmente a los operadores C. Combinado con la limitación de que solo se pueden usar infix los operadores que presionan a las personas para que intenten mapear una amplia gama de conceptos no relacionados en relativamente pocos símbolos como "+" y ">>"
Scala permite una amplia gama de símbolos válidos que no son palabras como nombres de métodos. Por ejemplo, tengo un DSL Prolog-ish incrustado donde puedes escribir
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
Los símbolos: -,!,? Y & se definen como métodos comunes. Solo en C ++ sería válido, por lo que un intento de mapear este DSL en C ++ requeriría algunos símbolos que ya evocan conceptos muy diferentes.
Por supuesto, esto también abre Scala a otro tipo de abuso. En Scala puede nombrar un método $! & ^% Si lo desea.
Para otros lenguajes que, como Scala, son flexibles en el uso de nombres de funciones y métodos que no son de palabras, consulte Smalltalk donde, como Scala, cada "operador" es solo otro método y Haskell que permite al programador definir la precedencia y la fijación de nombres flexibles funciones