Vector3f
私はScalaでjMonkeyEngine(Java Game Engine)を使用していますが、これはこれまでのところかなりうまく機能していますが、 (および同様の)クラスの演算子をオーバーロードするエレガントな方法があるかどうかを自問しています。Vector3f
私の最初のアイデアは、演算子を継承してオーバーロードすることVector3f
でしたが、最終的なものであるため、これはオプションではありません。次に、以下のように動作する静的メソッドを備えたシングルトン/scalaオブジェクトを作成できるかもしれないと思いましたVector3f
が、それも機能しません。
object VectorMath {
def *(factor: Float, vector: Vector3f) = vector.mult(factor)
}
//and then somewhere
import VectorMath._
var v = new Vector3f(1,2,3);
var u = 1.2f * v; //this does not work, because Float does not have * overloaded for Vector3f
var u = VectorMath.*(1.2f, v); //this does work, but defeats the purpose
したがって、今考えられるのは、Vector3fを新しいScalaクラスでラップし、オペレーター呼び出しを適切なJavaメソッドに委任することだけです。ただし、これには3つの欠点があります。
- 私は多くの前後の変換(a
toVector3f
とfromVector3f
メソッドまたはそのようなもの)を行う必要があります。 - Vector3f / ScalaVectorsの配列がある場合、この問題はさらに悪化します。クラスは(構成を除いて)関連していないため、jMEでメソッドを呼び出すたびに、配列のすべての要素を手動でキャストする必要があります。
- それでも、新しいScalaVectorクラスの演算子をオーバーロードして、前に因子を含めることができるような方法はありません
1.2f * v
。
私の質問:誰かがこれをより自然でエレガントにする方法を考えることができますか?同様の問題にどのように取り組みますか?それとも、このようなことをするために私が知らないScala構文があるのでしょうか?C ++では、floatとVector3fを引数として取り、場合によってはそれをフレンドにするグローバル演算子を作成します。これを行うためのScalaの方法は何ですか、それとも単に不可能ですか?