參數解組 - 更多詳情
類型檢查
類型檢查分為兩個步驟
- 檢查參數取消元組化是否可行
- 調整函數並檢查類型
可行性檢查
假設函數 f
的形式為 (p1, ..., pn) => e
(其中 n > 1
),其中 p1, ..., pn
為參數,e
為函數主體。
如果檢查 f
的預期類型為完全定義的函數類型,形式為 TupleN[T1, ..., Tn] => R
(或等效的 SAM 類型),其中每個類型 Ti
都符合對應的參數 pi
。則 f
可行於預期類型 TupleN[T1, ..., Tn] => R
的參數取消元組化。
如果下列兩個案例之一為 true
,則類型 Ti
符合參數 pi
pi
沒有類型,也就是說它是一個簡單的識別碼或_
。pi
的形式為x: Ui
或_: Ui
,且Ti <: Ui
。
參數解組與 eta 展開組成。也就是說,由 eta 展開產生的 n 元函數,反過來可以用參數解組適應預期的類型。
項適應
如果函數
(p1, ..., pn) => e
對於參數解組是可行的,預期的類型為 TupleN[T1, ..., Tn] => Te
,則繼續類型檢查以下適應函數
(x: TupleN[T1, ..., Tn]) =>
def p1: T1 = x._1
...
def pn: Tn = x._n
e
,預期的類型相同。
遷移
以前無法編寫這樣的程式碼,因此採用後新符號不會產生歧義。
有人可能已經為 (T1, ..., Tn) => R
撰寫了一個隱式轉換,轉換為 TupleN[T1, ..., Tn] => R
,其中 n
為某個數字。這樣的轉換現在僅適用於函數值的通用轉換,當參數解組不適用時。需要小心才能有效率地實作轉換。過時的轉換可以由 Scalafix
偵測並修正。
參考
如需更多資訊,請參閱 Issue #897。
在本文中