在 GitHub 上编辑此页面

上下文边界

上下文界限是一种简写,用于表示依赖于类型参数的上下文参数的常见模式。使用上下文界限,上一部分的 maximum 函数可以这样编写

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

在方法或类的类型参数 T 上的界限(如 : Ord)表示上下文参数 using Ord[T]。从上下文界限生成的上下文参数按如下方式添加

  • 如果方法参数以隐式参数列表或 using 子句结尾,则上下文参数将添加到该列表之前。
  • 否则,它们将作为单独的参数子句添加到末尾。

示例

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
本文内容