如何在 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
我在科特林中有一个 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