kotlin运算符重载的plus和plusAssign有什么区别?

时间:2017-10-14 02:25:29

标签: kotlin

我知道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不能做什么?

1 个答案:

答案 0 :(得分:9)

当你谈论重载时,你可以完全控制函数的功能,即使你完全交换了plusplusAssign的实现(在Kotlin中不可能),甚至{{ 1}}。虽然你被允许这样做,但不建议这样做。

通常,minus函数应该是函数(没有副作用的函数),它连接两个对象并返回连接结果。它不会更改对象的值。 plus应该是 mutating 函数,它将左侧操作数与右侧操作数连接起来。它会改变对象(左侧操作数),而不是将结果传回。