是否可以在 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 类)。那么你的代码应该可以正常工作,错误可能在其他地方。
关于scala - 重载复合运算符,例如 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666653/