在許多情況下,內容參數 的名稱不必明確提及,因為它只會在編譯器中用於其他內容參數的合成引數中。在這種情況下,您不必定義參數名稱,只需提供參數類型即可。
背景
例如,考慮一個方法 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
的參數。
為了完整性,以下是 max
和 Ord
的定義(請注意,在實務中,我們會對 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 常見問題集。
此頁面的貢獻者
內容
- 簡介
- Scala 特色
- 為什麼選擇 Scala 3?
- Scala 體驗
- Hello, World!
- REPL
- 變數和資料類型
- 控制結構
- 領域建模
- 方法
- 一級函數
- 單例物件
- 集合
- 情境抽象
- 頂層定義
- 摘要
- 初探類型
- 字串內插
- 控制結構
- 領域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特色
- Scala 3 中的主要方法
- 摘要
- 函數
- 匿名函數
- 函數變數
- Eta 展開
- 高階函數
- 撰寫自己的 map 方法
- 建立回傳函數的方法
- 摘要
- 封裝和匯入
- Scala 集合
- 集合類型
- 集合方法
- 摘要
- 函數式程式設計
- 什麼是函數式程式設計?
- 不可變值
- 純函數
- 函數即值
- 函數式錯誤處理
- 摘要
- 類型和類型系統
- 推論類型
- 泛型
- 交集類型
- 聯集類型
- 代數資料類型
- 變異
- 不透明類型
- 結構類型
- 依賴函數類型
- 其他類型
- 情境抽象
- 擴充方法
- 情境參數
- 內容界限
- 已給予的匯入
- 類型類別
- 多重相等性
- 隱式轉換
- 摘要
- 並行性
- Scala 工具
- 使用 sbt 建置和測試 Scala 專案
- 工作表
- 與 Java 互動
- Java 開發人員的 Scala
- JavaScript 開發人員的 Scala
- Python 開發人員的 Scala
- 下一步