Kotlin研發第二十彈 運算子過載

2021-09-23 22:35:41 字數 3000 閱讀 2179

函式命名的中綴呼叫

kotlin允許我們事先一些我們自定義型別的運算子實現,這些運算子有固定的表示和固定的優先順序。為實現這樣的運算子,餓哦們提供了固定名字的數字函式和擴充套件函式。比如二元運算子的左值和一元運算子的引數型別

一元運算子

表示式轉換

+aa.pluns()

-aa.minus()

!aa.not()

決定a的型別,假設為t

尋找接受者是t的無參函式plus(),比如數字函式或者擴充套件函式

如果這樣的函式缺失或不明確,則返回錯誤

如果函式是當前函式或返回型別是r則表示式+ar型別

注意這些操作符合其他的一樣,都是被優化為基本型別並且不會產生多餘的開銷

表示式轉換a++

a.inc()+see below

b–b.dex()+see below

這些操作符允許修改接收者和返回型別

編譯器是這樣解決有字尾的操作符的,如a++:

決定a的型別,假設t尋找無參函式inc(),作用在接收者t

如果返回型別是r必須是t的子類

計算表示式的效果是:

把a的初始值儲存在a()中

把a.inc()的結果作用在a上

把a()作為表示式的返回值

a—、++a、—a 的步驟是一樣的

表示式轉換

a+ba.plus(b)

a-ba.minus(b)

a*ba.times(b)

a/ba.div(b)

a%ba.mod(b)

a…ba.rangeto(b)

表示式只是解決了該表中翻譯為列的表示式

表示式轉換a in b

b.contains(a)

a !in b

!b.contains(a)

in和!in的產生步驟是一樣的,但是引數順序是相反的標誌

轉換a[i]

a.get(i)

a[i,j]

a.get(i,j)

a[i_1,…,i_n]

a.get(i_1,…i_n)

a[i]=b

a.set(i,b)

a[i,j]=b

a.set(i,j,b)

a[i_1,…,i_n]=b

a.set(i_1,…,o_n,b)

方括號被準換為get set函式

標誌轉換

a(i)

a.invoke(i)

a(i,j)

a.invoke(i,j)

a(i_1,…,i_n)

a.invoke(i_1,…,i_n)

括號被準換為帶有正確引數的invoke引數

表示式轉換

a+=b

a.plusassign(b)

a-=b

a.minusassign(b)

a*=b

a.timesassign(b)

a/=b

a.divassign(b)

a%=b

a.modassign(b)

在分配a+=b時編譯器是下面這樣實現的:

右邊列的函式是否可用

對應的二元函式是否也可用,不可用報告錯誤

確定它的返回值是unit是否報告錯誤

生成a.plusassign(b)

否則試著生成a=a+b**

表示式

轉換a==b

a?.equals(b) ?: b.identityequals(null)

a!=b

!(a?.equals(b) ?: b.identityequals(null))

注意=== 和!==是不允許過載的

==操作符有兩點特別:

它被翻譯成乙個複雜的表示式,用於篩選空值,而且null==null是真

它需要帶有特定簽名的函式,而不僅僅是特定名稱的函式,下面這樣:

fun

equals

(other:any?

):boolean

或者用相同的引數列表和返回型別的擴充套件功能標誌

轉換a>b

a.compareto(b)>0

aa.compareto(b)<0

a>=b

a.compareto(b)>=0

a<=b

a.compareto(b)<=0

所有的比較都轉為compareto的呼叫,這個函式需要返回int

函式用infix關鍵字標識的函式,叫中綴函式。

中綴函式必須符合以下幾點:

必須是成員函式或者是擴充套件函式

必須只有乙個引數

這個引數必須是可變引數型別,而且不能有預設值

必須使用infix關鍵字修飾

//中綴函式

infix

fun string.

add(str:string)

:string

funtestinfix()

")}

輸出

my name is wangyong

第二十九課 邏輯「與」運算子

與 的異同點 相同點 二者都表示與操作,當且僅當運算子兩邊的運算元都為true時,其結果才為true,否則為false。不同點 在使用 進行運算時,不論左邊為true或者false,右邊的表示式都會進行運算。如果使用 進行運算時,當左邊為false時,右邊的表示式不會進行運算,因此 被稱作短路與,在...

Kotlin展開運算子

當你需要傳遞乙個陣列引數時,在kotlin中需要你解包陣列,以便每個陣列元素在函式中能作為單獨的引數來呼叫。我們使用 號來展開這個陣列。fun main one,two,three,four 下面這為錯誤的 fun main type mismatch inferred type is listbu...

Kotlin學習2 3 運算子

算術運算子用於數值型別的運算,kotlin語言支援基本的算術運算 加法 減法 乘法 除法 取餘 以及自增自減運算。如 var inta int 5 5 10 val intb int 10 2 8 val intc int 3 4 12 val intd int 10 5 2 val inte in...