2017-10-14 140 views
2

我知道plusplusAssign之間有一些區別,後者不能返回任何東西,但我發現plus可以實現什麼plusAssign做什麼。運算符重載kotlin中的plus和plusAssign有什麼區別?

A Point class overloads 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

當然,當我做'a + b'時,你可以修改'a',但我完全希望你不要這樣做,因爲它是瘋了。 – chris

回答

6

當你在談論超載,你的函數做什麼的完全控制,甚至你完全互換的plusplusAssign(在科特林是不可能的),甚至minus實施。雖然你被允許這樣做,但並不建議。

一般而言,plus函數應該是一個純函數函數(無副作用的函數)連接兩個對象並返回連接結果。它不會更改對象的值。 plusAssign應該是變異函數,它將左側操作數和右側操作數連接起來。它會改變對象(左側操作數)而不是將結果傳回。

相關問題