在运算符重载kotlin中,plus和plusAssign有什么区别?

我知道plusplusAssign之间有一些区别,后者不能返回任何东西,但是我发现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不能?

当你谈论重载的时候,你完全可以控制这个函数做什么,即使你完全交换了plusplusAssign的实现(Kotlin不可能),甚至是minus 。 虽然你可以这样做,但并不是建议。

一般来说, plus函数应该是一个函数(没有副作用的函数),它连接两个对象并返回连接的结果。 它不会更改对象的值。 plusAssign应该是一个连接左侧操作数和右侧操作数的变异函数。 它会改变对象(左侧的操作数)而不是将结果传回。