我试试了Kotlin,因为它应该是一个没有某些限制的java,例如检查异常或者不支持运算符覆盖(当然这些限制使它们存在权利,例如减少滥用或强制冗长,但这个问题并不是他们应该(不)存在的原因。所以我写了一个简单的Vector2
类,它应该支持像+ - * /。
当您的第一个和第二个操作数都来自Vector2
类型时,没有问题,但是当第一个操作数不是来自类型Vector2
时,会出现问题。举个例子:
fun main(args: Array<String>) {
val vector = Vector2(2.0, 3.0) * 2.0
}
由于Vector2
:
operator fun times(d: Double) = Vector2(x * d, y * d)
但如果这两个操作数改变了这样的地方,我应该怎么做:
fun main(args: Array<String>) {
val vector = 2.0 * Vector2(2.0, 3.0)
}
我虽然对times()
类型的Double
运算符重载:
// In 'Vector2.kt'
operator fun Double.times(vector: Vector2) = ...
但我不知道如何检索double值以将其与向量相乘。
有人可以帮忙吗?提前谢谢!
答案 0 :(得分:2)
定义extension function时,接收者(调用函数的对象)始终以this
的形式提供给实现主体。
operator fun Double.times(vector: Vector2): Vector2 = vector * this
你可以用任何你想要的方式实现,我只是颠倒了操作数来缩短这个例子。