是否有可能在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
,但可以想象有一些复杂的类别,差异可能很重要。
答案 0 :(得分:2)
当然可以为+=
提供您自己的实现,但我怀疑您的问题来自隐式转换。
如果Vector3f
已提供+=
方法,则调用该方法不会触发从Vector3f
到Vector3fMath
的隐式转换。
例如,如果a
和b
都是Vector3f
,那么
a += b
将在+=
上调用Vector3f
方法,这是完全可以预期的。
为了触发隐式转换,您需要使用尚未定义的方法Vector3f
。你必须选择另一个名字,也许是另一个名字。
好的,所以Vector3f
没有定义+=
(因为它是Java类)。那么你的代码应该可以正常运行,错误可能在其他地方。