在 GitHub 上編輯此頁面

參數解組

假設您有一個配對清單

val xs: List[(Int, Int)]

而且您想要將 xs 對應到 Int 清單,以便每個數字配對對應到它們的總和。以前,執行此操作的最佳方式是使用樣式比對分解

xs map {
  case (x, y) => x + y
}

雖然正確,但這也不方便且令人困惑,因為 case 表示樣式比對可能會失敗。作為更簡短且更明確的替代方案,Scala 3 現在允許

xs.map {
  (x, y) => x + y
}

或等效地

xs.map(_ + _)

def combine(i: Int, j: Int) = i + j
xs.map(combine)

通常,如果這是預期的類型,則具有 n > 1 參數的函數值會包裝在 ((T_1, ..., T_n)) => U 形式的函數類型中。元組參數會分解,其元素會直接傳遞到基礎函數。

更具體地說,適應會套用於不匹配的形式參數清單。特別是,適應並非函數類型之間的轉換。這就是為什麼不接受以下內容的原因

val combiner: (Int, Int) => Int = _ + _
xs.map(combiner)     // Type Mismatch

函數值必須明確元組化,而不是取消參數元組化

xs.map(combiner.tupled)

儘管強烈不建議,但為了產生相同的效應,使用者程式碼中可以提供隱式轉換

import scala.language.implicitConversions

transparent inline given `fallback untupling`: Conversion[(Int, Int) => Int, ((Int, Int)) => Int] = _.tupled

xs.map(combiner)

在套用轉換之前會嘗試參數解組,因此範圍內的轉換無法破壞解組。

參考

如需更多資訊,請參閱

在本文中