Scala 3 — 書籍

內容界限

語言

在許多情況下,內容參數 的名稱不必明確提及,因為它只會在編譯器中用於其他內容參數的合成引數中。在這種情況下,您不必定義參數名稱,只需提供參數類型即可。

背景

例如,考慮一個方法 maxElement,它會傳回集合中的最大值

def maxElement[A](as: List[A])(implicit ord: Ord[A]): A =
  as.reduceLeft(max(_, _)(ord))
def maxElement[A](as: List[A])(using ord: Ord[A]): A =
  as.reduceLeft(max(_, _)(using ord))

方法 maxElement 採用類型 Ord[A]內容參數,僅將其傳遞為方法 max 的參數。

為了完整性,以下是 maxOrd 的定義(請注意,在實務中,我們會對 List 使用現有的方法 max,但我們編造這個範例作為說明用途)

/** Defines how to compare values of type `A` */
trait Ord[A] {
  def greaterThan(a1: A, a2: A): Boolean
}

/** Returns the maximum of two values */
def max[A](a1: A, a2: A)(implicit ord: Ord[A]): A =
  if (ord.greaterThan(a1, a2)) a1 else a2
/** Defines how to compare values of type `A` */
trait Ord[A]:
  def greaterThan(a1: A, a2: A): Boolean

/** Returns the maximum of two values */
def max[A](a1: A, a2: A)(using ord: Ord[A]): A =
  if ord.greaterThan(a1, a2) then a1 else a2

請注意,方法 max 採用類型 Ord[A] 的內容參數,就像方法 maxElement 一樣。

省略內容參數

由於 ord 是方法 max 中的內容參數,因此編譯器可以在我們呼叫方法 max 時,在 maxElement 的實作中為我們提供它

def maxElement[A](as: List[A])(implicit ord: Ord[A]): A =
  as.reduceLeft(max(_, _))
def maxElement[A](as: List[A])(using Ord[A]): A =
  as.reduceLeft(max(_, _))

請注意,由於我們不需要將其明確傳遞給方法 max,因此我們可以在方法 maxElement 的定義中省略其名稱。這是一個匿名內容參數

內容界限

在上述背景下,內容界限是一種簡寫語法,用於表達「應用於類型參數的內容參數」的模式。

使用內容界限,maxElement 方法可以這樣撰寫

def maxElement[A: Ord](as: List[A]): A =
  as.reduceLeft(max(_, _))

方法或類別的類型參數 A 上的界限(例如 : Ord)表示類型為 Ord[A] 的內容參數。在幕後,編譯器會將此語法轉換為背景部分中所示的語法。

有關內容界限的更多資訊,請參閱 “什麼是內容界限?” 部分的 Scala 常見問題集。

此頁面的貢獻者