C ++ mewarisi operator biru yang sebenarnya dari C. Maksud saya bahwa "+" di 6 + 4 sangat istimewa. Anda tidak bisa, misalnya, mendapatkan pointer ke fungsi + itu.
Scala di sisi lain tidak memiliki operator seperti itu. Itu hanya memiliki fleksibilitas besar dalam mendefinisikan nama metode ditambah sedikit dibangun diutamakan untuk simbol non-kata. Jadi secara teknis Scala tidak memiliki kelebihan operator.
Apa pun yang Anda ingin menyebutnya, kelebihan operator pada dasarnya tidak buruk, bahkan di C ++. Masalahnya adalah ketika programmer buruk menyalahgunakannya. Tapi sejujurnya, saya berpendapat bahwa menghilangkan kemampuan programmer untuk menyalahgunakan kelebihan operator tidak akan membuat Anda memperbaiki semua hal yang bisa disalahgunakan oleh programmer. Jawaban sebenarnya adalah mentoring. http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html
Tidak ada yang kurang, ada perbedaan antara overloading operator C ++ dan metode penamaan yang fleksibel Scala yang, IMHO, membuat Scala lebih baik dan lebih kasar.
Di C ++ satu-satunya cara untuk mendapatkan notasi in-fix adalah menggunakan operator. Kalau tidak, Anda harus menggunakan object.message (argumen) atau pointer-> messsage (argumen) atau fungsi (argument1, argument2). Jadi jika Anda ingin gaya DSLish tertentu untuk kode Anda maka ada tekanan untuk menggunakan operator.
Di Scala Anda bisa mendapatkan notasi infiks dengan mengirim pesan apa pun. "argumen pesan objek" sangat oke, yang berarti Anda tidak perlu menggunakan simbol non-kata hanya untuk mendapatkan notasi infiks.
Kelebihan operator C ++ terbatas pada dasarnya operator C. Dikombinasikan dengan batasan bahwa hanya operator yang dapat menggunakan infiks yang menekan orang untuk mencoba memetakan berbagai konsep yang tidak terkait ke simbol yang relatif sedikit seperti "+" dan ">>"
Scala memungkinkan sejumlah besar simbol non-kata yang valid sebagai nama metode. Sebagai contoh, saya punya DSL Prolog-ish tertanam di mana Anda dapat menulis
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
Simbol: -,!,?, Dan & didefinisikan sebagai metode biasa. Dalam C ++ saja & akan valid sehingga upaya untuk memetakan DSL ini ke C ++ akan memerlukan beberapa simbol yang sudah membangkitkan konsep yang sangat berbeda.
Tentu saja, ini juga membuka Scala untuk jenis penyalahgunaan lainnya. Di Scala, Anda dapat memberi nama metode $! & ^% Jika mau.
Untuk bahasa lain yang, seperti Scala, fleksibel dalam penggunaan fungsi non-kata dan nama metode lihat Smalltalk di mana, seperti Scala, setiap "operator" hanyalah metode lain dan Haskell yang memungkinkan pemrogram untuk menentukan prioritas dan perbaikan dari nama fleksibel. fungsi.