重载复合运算符,如+ =

时间:2014-09-04 13:22:09

标签: scala operator-overloading compound-assignment

是否有可能在Scala中直接重载operator + =?它可能对某些复杂类型有用,其中+ = b可能具有更高效和更简单的实现a = a + b。

我最近遇到的情况是我从jMonkeyEngine(com.jme.math)提供Vector3f的运算符。一个自然的实现可能看起来像:

  import com.jme3.math.{Matrix3f, Vector3f}

  object JMEMathOperators {
    implicit class Vector3fMath(val a: Vector3f) extends AnyVal {
      def - (b: Vector3f) = a subtract b
      def + (b: Vector3f) = a add b
      def * (b: Vector3f) = a mult b
      def * (b: Float) = a mult b

      def += (b: Vector3f) = a addLocal b
    }
  }

尽管没有编译错误,我的+=实现永远不会被调用。在这种情况下,差异并不重要,addLocal效率仅略高于add,但可以想象有一些复杂的类别,差异可能很重要。

1 个答案:

答案 0 :(得分:2)

当然可以为+=提供您自己的实现,但我怀疑您的问题来自隐式转换。

如果Vector3f已提供+=方法,则调用该方法不会触发从Vector3fVector3fMath的隐式转换。

例如,如果ab都是Vector3f,那么

a += b

将在+=上调用Vector3f方法,这是完全可以预期的。

为了触发隐式转换,您需要使用尚未定义的方法Vector3f。你必须选择另一个名字,也许是另一个名字。


更新

好的,所以Vector3f没有定义+=(因为它是Java类)。那么你的代码应该可以正常运行,错误可能在其他地方。