C ++ наследует истинные синие операторы от C. Под этим я подразумеваю, что «+» в 6 + 4 очень особенный. Например, вы не можете получить указатель на эту + функцию.
Scala, с другой стороны, не имеет операторов таким образом. Он просто обладает большой гибкостью в определении имен методов, плюс немного встроенного приоритета для несловарных символов. Так что технически у Scala нет перегрузки операторов.
Как ни крути, перегрузка операторов не так уж плоха, даже в C ++. Проблема в том, что плохие программисты злоупотребляют этим. Но, честно говоря, я придерживаюсь мнения, что устранение способности программистов злоупотреблять перегрузкой операторов не дает оснований исправлять все то, что программисты могут злоупотреблять. Настоящий ответ - наставничество. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Тем не менее, существуют различия между перегрузкой операторов C ++ и гибким именованием методов Scala, которые, IMHO, делают Scala менее уязвимым и более уязвимым.
В C ++ единственный способ получить фиксированную запись - использовать операторы. В противном случае вы должны использовать object.message (аргумент) или pointer-> messsage (аргумент) или функцию (аргумент1, аргумент2). Так что если вы хотите определенный стиль DSLish для своего кода, тогда есть необходимость использовать операторы.
В Scala вы можете получить инфиксную запись с любым отправленным сообщением. «Аргумент объекта сообщения» совершенно нормально, что означает, что вам не нужно использовать несловарные символы только для того, чтобы получить инфиксную запись.
Перегрузка операторов C ++ ограничена по существу операторами C. В сочетании с ограничением, что только операторы могут использовать инфикс, который заставляет людей пытаться отобразить широкий спектр несвязанных понятий на относительно небольшое количество символов, таких как «+» и «>>»
Scala допускает огромный диапазон допустимых несловесных символов в качестве имен методов. Например, у меня есть встроенный DSL Пролог, где вы можете написать
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
Символы: -,!,? И & определяются как обычные методы. В C ++ только & будет допустимым, поэтому попытка отобразить этот DSL в C ++ потребует некоторых символов, которые уже вызывают совершенно разные понятия.
Конечно, это также открывает Scala для другого вида злоупотреблений. В Scala вы можете назвать метод $! & ^%, Если хотите.
Для других языков, которые, например, Scala, являются гибкими в использовании несловесных функций и имен методов, см. Smalltalk, где, как и Scala, каждый «оператор» - это просто еще один метод, и Haskell, который позволяет программисту определять приоритет и фиксированность гибко именованных имен. функции.