在运算符重载kotlin中,plus和plusAssign有什么区别?
我知道plus
和plusAssign
之间有一些区别,后者不能返回任何东西,但是我发现plus
可以实现plusAssign
功能。
Point
类重载plus
并返回一个新的Point
。
data class Point(var x: Int, var y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } }
Point
类重载plusAssign
但不返回新的Point
。
data class Point(var x: Int, var y: Int) { operator fun plusAssign(other: Point): Unit { this.x+=other.x this.y+=other.y } }
但是我发现它也可以这样实现:
data class Point(var x: Int, var y: Int) { operator fun plus(other: Point): Point { this.x+=other.x this.y+=other.y return this; } }
所以,我找不到什么使得plusAssign
特别,有什么plusAssign
可以做,但plus
不能?
当你谈论重载的时候,你完全可以控制这个函数做什么,即使你完全交换了plus
和plusAssign
的实现(Kotlin不可能),甚至是minus
。 虽然你可以这样做,但并不是建议。
一般来说, plus
函数应该是一个纯函数(没有副作用的函数),它连接两个对象并返回连接的结果。 它不会更改对象的值。 plusAssign
应该是一个连接左侧操作数和右侧操作数的变异函数。 它会改变对象(左侧的操作数)而不是将结果传回。