C ++はCからtrue blue演算子を継承します。つまり、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)を使用する必要があります。したがって、コードに特定のDSL風のスタイルが必要な場合は、演算子を使用する必要があります。
Scalaでは、任意のメッセージ送信でインフィックス表記を取得できます。「オブジェクトメッセージ引数」は完全に問題ありません。つまり、中置表記を取得するためだけに非単語記号を使用する必要はありません。
C ++演算子のオーバーロードは、基本的にC演算子に制限されています。「+」や「>>」などの比較的少数の記号に関連のない広範な概念をマッピングしようとするように人々に圧力をかける演算子のみを使用できるという制限と組み合わせる
Scalaでは、メソッド名として、単語以外の有効な記号を幅広く使用できます。たとえば、私はあなたが書くことができる組み込みPrologっぽい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 ++にマップするには、すでに非常に異なる概念を呼び起こすいくつかのシンボルが必要です。
もちろん、これはScalaを別の種類の虐待にさらします。Scalaでは、必要に応じてメソッドに$!&^%という名前を付けることができます。
Scalaのように、非単語関数とメソッド名の使用に柔軟性がある他の言語については、Smalltalkを参照してください。Scalaのように、すべての「演算子」は単なる別のメソッドであり、プログラマーが柔軟な名前の優先順位と固定性を定義できるようにするHaskellです。関数。