重载+=等复合运算符



是否可以在Scala中直接重载运算符+=?它可能对一些复杂类型有用,其中a+=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,但可以想象,在一些复杂的类别中,差异可能很重要。

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

如果Vector3f已经提供了+=方法,那么调用它不会触发从Vector3fVector3fMath的隐式转换。

例如,如果ab都是Vector3f,则执行

a += b

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

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


更新

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

最新更新