2

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

我最近遇到的案例是我Vector3f从 jMonkeyEngine (com.jme.math) 提供算子。一个自然的实现可能如下所示:

  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,但可以想象存在一些复杂的类,其中差异可能很重要。

4

1 回答 1

2

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

如果Vector3f已经提供了一个+=方法,调用它不会触发从Vector3fto的隐式转换Vector3fMath

例如, ifabare both Vector3f,做

a += b

将调用+=on 方法Vector3f,这是完全可以预料的。

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


更新

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

于 2014-09-04T13:41:42.990 回答