C ++은 C의 진정한 파란색 연산자를 상속합니다. 즉, 6 + 4의 "+"는 매우 특별합니다. 예를 들어, 그 + 함수에 대한 포인터를 얻을 수 없습니다.
반면 스칼라는 그런 식으로 연산자가 없습니다. 단어 이름이 아닌 기호에 대해 메소드 이름과 약간의 우선 순위를 정의 할 때 유연성이 뛰어납니다. 따라서 기술적으로 스칼라에는 운영자 과부하가 없습니다.
호출하고자하는 것이 무엇이든, 연산자 오버로딩은 본질적으로 C ++에서도 나쁘지 않습니다. 문제는 나쁜 프로그래머가 그것을 남용 할 때입니다. 그러나 솔직히 말해서 프로그래머 오버로드를 남용하는 프로그래머의 능력을 빼앗아도 프로그래머가 남용 할 수있는 모든 것을 고치는 버킷이 줄어들지는 않는다고 생각합니다. 진정한 대답은 멘토링입니다. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
그럼에도 불구하고, C ++의 연산자 오버로딩과 스칼라의 유연한 메소드 이름은 IMHO로 인해 스칼라가 덜 학 대화되고 더 학 대화되도록하는 차이점이 있습니다.
C ++에서 고정 표기법을 얻는 유일한 방법은 연산자를 사용하는 것입니다. 그렇지 않으면 object.message (argument) 또는 pointer-> messsage (argument) 또는 function (argument1, argument2)을 사용해야합니다. 따라서 코드에 특정 DSL 스타일을 원한다면 연산자를 사용해야하는 압력이 있습니다.
스칼라에서는 모든 메시지 전송과 함께 접두사 표기법을 얻을 수 있습니다. "객체 메시지 인수"는 완벽하게 적용됩니다. 즉, 부호가 아닌 단어를 사용할 필요가 없습니다.
C ++ 연산자 오버로딩은 기본적으로 C 연산자로 제한됩니다. "+"및 ">>"와 같은 비교적 적은 수의 기호에 광범위한 관련없는 개념을 매핑하도록 사람들에게 압력을 가하는 조작자 만 사용할 수 있다는 한계와 결합
스칼라는 메서드 이름으로 유효한 비 단어 기호를 광범위하게 허용합니다. 예를 들어, 쓸 수있는 내장 Prolog-ish 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 ++에 매핑하려면 이미 다른 개념을 불러 일으키는 몇 가지 기호가 필요합니다.
물론 이것은 또 다른 종류의 학대에 스칼라를 열어줍니다. 스칼라에서는 원한다면 메소드 이름을 $! & ^ %로 지정할 수 있습니다.
스칼라와 같이 단어가 아닌 함수 및 메소드 이름을 사용하는 데 융통성이있는 다른 언어의 경우 스칼라와 같이 모든 "연산자"는 또 다른 방법 인 Haskell과 프로그래머가 융통성있게 명명 된 우선 순위 및 고정도를 정의 할 수있는 스몰 토크를 참조하십시오. 기능.