是否可以在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
已经提供了+=
方法,那么调用它不会触发从Vector3f
到Vector3fMath
的隐式转换。
例如,如果a
和b
都是Vector3f
,则执行
a += b
将在Vector3f
上调用+=
方法,这是完全预期的。
为了触发隐式转换,您需要使用尚未定义的Vector3f
方法。你必须选择另一个名字,也许是另一个符号。
更新
好的,所以Vector3f
没有定义+=
(因为它是一个Java类)。那么您的代码应该可以正常工作,错误可能在其他地方。