Context Bounds
情境界限是一種簡寫,用於表達依賴於類型參數的常見情境參數模式。使用情境界限,上一個區段的 maximum
函數可以這樣撰寫
def maximum[T: Ord](xs: List[T]): T = xs.reduceLeft(max)
在方法或類型的類型參數 T
上的界限,例如 : Ord
,表示情境參數 using Ord[T]
。從情境界限產生的情境參數會以以下方式新增
- 如果方法參數以隱含參數清單或使用子句結尾,情境參數會新增在該清單之前。
- 否則,它們會在結尾處新增為一個獨立的參數子句。
範例
def f[T: C1 : C2, U: C3](x: T)(using y: U, z: V): R
會擴充為
def f[T, U](x: T)(using _: C1[T], _: C2[T], _: C3[U], y: U, z: V): R
情境界限可以與子類型界限結合。如果同時存在,子類型界限會優先,例如
def g[T <: B : C](x: T): R = ...
遷移
為了簡化遷移,Dotty 中的情境界限會在 Scala 3.0 中對應到舊式隱含參數,其參數可以使用 (using ...)
子句或一般應用程式傳遞。從 Scala 3.1 開始,它們會對應到情境參數,如上所述。
如果來源版本為 future-migration
,任何與正常引數繫結的內容繫結所產生的證據內容參數配對都會產生遷移警告。警告指出需要 (using ...)
子句。可以在 -rewrite
下自動執行改寫。
語法
TypeParamBounds ::= [SubtypeBounds] {ContextBound}
ContextBound ::= ‘:’ Type
本文內容