scala - 重载复合运算符,例如 +=

标签 scala operator-overloading compound-assignment

是否可以在 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 类)。那么你的代码应该可以正常工作,错误可能在其他地方。

关于scala - 重载复合运算符,例如 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666653/

相关文章:

c++ - 输入一个指针并返回该指针的方法?

python - 以其他维度的关联值为条件对 3d numpy 数组的分配进行矢量化

scala - 在 Shapeless 中实现路径相关的 map 类型

scala - 为什么在 ScalaQuery 的 "Missing parameter type"子句中访问表时会出现 "withTransaction"?

c++ - 使用运算符重载添加两个 vector

java - 如果Java没有运算符重载, "string1"+ "string2"怎么可能?

c++ - 赋值运算符内的序列点

java - BlueJ Java 复合条件

scala - 将函数转换/门面化为方法

scala - 调用方法时依赖于类型的隐式强制转换