在 GitHub 上編輯此頁面

參數解組 - 更多詳情

類型檢查

類型檢查分為兩個步驟

  1. 檢查參數取消元組化是否可行
  2. 調整函數並檢查類型

可行性檢查

假設函數 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