C ++ thừa hưởng các toán tử màu xanh thực sự từ C. Điều đó có nghĩa là "+" trong 6 + 4 rất đặc biệt. Chẳng hạn, bạn không thể lấy một con trỏ tới hàm + đó.
Scala mặt khác không có nhà khai thác theo cách đó. Nó chỉ có tính linh hoạt cao trong việc xác định tên phương thức cộng với một chút ưu tiên được xây dựng cho các ký hiệu không phải từ. Vì vậy, về mặt kỹ thuật Scala không có quá tải toán tử.
Dù bạn muốn gọi nó là gì, quá tải toán tử không hẳn là xấu, ngay cả trong C ++. Vấn đề là khi các lập trình viên xấu lạm dụng nó. Nhưng thành thật mà nói, tôi cho rằng việc lấy đi khả năng của các lập trình viên để lạm dụng quá tải toán tử không làm giảm khả năng sửa chữa tất cả những điều mà lập trình viên có thể lạm dụng. Câu trả lời thực sự là cố vấn. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Hơn thế nữa, có sự khác biệt giữa quá tải toán tử của C ++ và cách đặt tên phương thức linh hoạt của Scala, IMHO, làm cho Scala vừa ít sử dụng hơn vừa dễ sử dụng hơn.
Trong C ++, cách duy nhất để có được ký hiệu sửa lỗi là sử dụng các toán tử. Nếu không, bạn phải sử dụng object.message (đối số) hoặc con trỏ-> messsage (đối số) hoặc hàm (argument1, argument2). Vì vậy, nếu bạn muốn một kiểu DSLish nhất định cho mã của mình thì sẽ có áp lực phải sử dụng các toán tử.
Trong Scala, bạn có thể nhận được ký hiệu infix với bất kỳ tin nhắn nào gửi. "đối số thông điệp đối tượng" là hoàn toàn ổn, điều đó có nghĩa là bạn không cần sử dụng các ký hiệu không phải từ chỉ để có ký hiệu infix.
Quá tải toán tử C ++ được giới hạn ở cơ bản các toán tử C. Kết hợp với giới hạn chỉ các toán tử mới có thể được sử dụng, điều này gây áp lực cho mọi người khi cố gắng ánh xạ một loạt các khái niệm không liên quan đến một vài biểu tượng như "+" và ">>"
Scala cho phép một loạt các ký hiệu không phải từ hợp lệ làm tên phương thức. Chẳng hạn, tôi đã có một DSL Prolog-ish nhúng, nơi bạn có thể viết
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ác biểu tượng: -,!,?, Và & được định nghĩa là các phương thức thông thường. Chỉ trong C ++ và sẽ hợp lệ nên một nỗ lực ánh xạ DSL này vào C ++ sẽ yêu cầu một số biểu tượng đã gợi lên các khái niệm rất khác nhau.
Tất nhiên, điều này cũng mở ra Scala cho một loại lạm dụng khác. Trong Scala, bạn có thể đặt tên cho một phương thức $! & ^% Nếu bạn muốn.
Đối với các ngôn ngữ khác, như Scala, linh hoạt trong việc sử dụng hàm không phải từ và tên phương thức, xem Smalltalk, như Scala, mỗi "toán tử" chỉ là một phương thức khác và Haskell cho phép lập trình viên xác định quyền ưu tiên và tính cố định của tên được đặt linh hoạt chức năng.