Link Search Menu Expand Document

上下文界定

上下文界定(Context Bound)是表示依赖于类型参数的上下文参数的公共模式的简写。使用上下文界定,最后一段的 maximum 函数可以这样写:

def maximum[T: Ord](xs: List[T]): T = xs.reduceLeft(max)

在方法或类的类型参数 T 上的类似 : Ord 的界定表示具有 with Ord[T] 上下文参数。 从上下文界定生成的上下文参数在包含它的方法或类的定义的最后。例如:

def f[T: C1 : C2, U: C3](x: T)(using y: U, z: V): R

会被展开为

def f[T, U](x: T)(using y: U, z: V)(using C1[T], C2[T], C3[U]): R

上下文界定可以和子类型界定组合。如果两者都存在,那么子类型界定应该在最前,例如:

def g[T <: B : C](x: T): R = ...

迁移

为了简化迁移,Scala 3.0 中的上下文界定映射到旧式隐式参数,这些参数可以通过 (using ...) 子句或者普通的方法应用传递。 从 Scala 3.1 开始,它们将映射到如上所述的上下文参数。

If the source version is future-migration, any pairing of an evidence context parameter stemming from a context bound with a normal argument will give a migration warning. The warning indicates that a (using ...) clause is needed instead. The rewrite can be done automatically under -rewrite.

语法

TypeParamBounds   ::=  [SubtypeBounds] {ContextBound}
ContextBound      ::=  ‘:’ Type