C ++ dziedziczy prawdziwe niebieskie operatory z C. Rozumiem przez to, że „+” w 6 + 4 jest bardzo szczególne. Nie możesz na przykład pobrać wskaźnika do tej + funkcji.
Z drugiej strony Scala nie ma operatorów w ten sposób. Ma po prostu dużą elastyczność w definiowaniu nazw metod oraz trochę wbudowanego pierwszeństwa dla symboli niebędących słowami. Więc technicznie Scala nie ma przeciążenia operatora.
Jakkolwiek chcesz to nazwać, przeciążenie operatorów nie jest z natury złe, nawet w C ++. Problem polega na tym, że nadużywają go źli programiści. Ale szczerze mówiąc, jestem zdania, że odebranie programistom możliwości nadużywania przeciążenia operatorów nie jest kroplą w morzu w naprawianiu wszystkich rzeczy, które programiści mogą nadużywać. Prawdziwą odpowiedzią jest mentoring. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Niemniej jednak istnieją różnice między przeciążeniem operatorów C ++ a elastycznym nazewnictwem metod Scali, które, IMHO, sprawiają, że Scala jest zarówno mniej nadużywalna, jak i bardziej nadużywalna.
W C ++ jedynym sposobem uzyskania notacji w poprawkach jest użycie operatorów. W przeciwnym razie musisz użyć obiektu.message (argument) lub pointer-> messsage (argument) lub funkcji (argument1, argument2). Więc jeśli chcesz mieć określony styl DSLish w swoim kodzie, istnieje presja, aby używać operatorów.
W Scali możesz otrzymać notację wrostkową z każdą wysłaną wiadomością. "argument obiektu wiadomości" jest całkowicie w porządku, co oznacza, że nie musisz używać symboli innych niż słowo, aby uzyskać notację wrostkową.
Przeciążanie operatorów C ++ jest ograniczone zasadniczo do operatorów C. W połączeniu z ograniczeniem polegającym na tym, że tylko operatory mogą być używane wrostek, który wywiera presję na ludziach, aby próbowali odwzorować szeroki zakres niepowiązanych pojęć na stosunkowo nieliczne symbole, takie jak „+” i „>>”
Scala dopuszcza szeroką gamę ważnych symboli niebędących słowami jako nazw metod. Na przykład mam wbudowane DSL w Prologu, w którym możesz pisać
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
Symbole: -,!,? I & są zdefiniowane jako zwykłe metody. Tylko w C ++ & byłby ważny, więc próba odwzorowania tego DSL na C ++ wymagałaby pewnych symboli, które już wywołują bardzo różne koncepcje.
Oczywiście otwiera to również Scalę na inny rodzaj nadużyć. W Scali możesz nazwać metodę $! & ^%, Jeśli chcesz.
W przypadku innych języków, które, tak jak Scala, są elastyczne w używaniu funkcji niebędących słowami i nazw metod, zobacz Smalltalk, gdzie, podobnie jak Scala, każdy "operator" jest tylko inną metodą i Haskell, który pozwala programiście definiować pierwszeństwo i stałość elastycznie nazwanych Funkcje.