如何在 kotlin 中正确重载运算符

How to properly overload an operator in kotlin

我在科特林中有一个 Vec2 class。
我像这样重载了运算符 *

operator fun times(v:Float): Vec2 {
    return Vec2(this.x * v, this.y * v)
}

结束行为正如我所料,我可以使用**=来缩放向量

var a = Vec2() * 7f; a *= 2f

但是,根据我的理解,我在这里所做的是每次使用 *
时通过调用 Vec2() 创建一个新对象 即使我使用 *= 并且我真的不需要 return 任何东西,因为我可以只编辑对象本身(使用 this 关键字)

有什么方法可以重载 *= 运算符,使其具有与此函数类似的行为?

fun mul(v:Float) {
    this.x *= v; this.y *= v
}

我的应用需要顺利运行,而且这些运算符用的挺多的, 我不希望垃圾收集器的工作造成任何延迟。

无需创建新对象,您只需将 x 和 y 更改为 var,这样它们就可以重新分配了。

这样做很可能会让你得到这样的结果:

class Vec2(var x: Float, var y: Float) {
    operator fun times(v: Float) {
        x *= v
        y *= v
    }
}

那么在你的实现中就很简单了:

val a = Vec2(1.0f, 1.0f)
    
a * 2f
// After this line both x and y are 2.0f

如果你真的想重载 *= 运算符,那么添加 timesAssign 运算符函数来代替 for more info see the kotlin docs