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 (argument) або pointer-> messsage (argument) або function (argument1, argument2). Тож якщо ви хочете до свого коду певного стилю DSLish, тоді тиск на використання операторів.
У програмі Scala ви можете отримати позначення інфіксу з будь-яким надсиланням повідомлення. "аргумент об'єктного повідомлення" є цілком нормальним, це означає, що вам не потрібно використовувати несловові символи, щоб отримати позначення інфіксу.
Перевантаження C ++ операторів обмежено по суті операторами C. У поєднанні з обмеженням, що тільки оператори можуть використовуватись інфіксом, який тисне на людей, щоб спробувати відобразити широкий спектр непов'язаних понять на порівняно небагато символів, таких як "+" та ">>"
Scala дозволяє отримати величезний діапазон дійсних несловесних символів як назв методів. Наприклад, у мене вбудований DSL Prolog-ish, куди можна писати
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, який дозволяє програмісту визначати пріоритетність та фіксацію гнучко названих функції.