在许多情况下,上下文参数 的名称不必明确提及,因为编译器仅在其他上下文参数的合成参数中使用它。在这种情况下,你无需定义参数名称,只需提供参数类型即可。
背景
例如,考虑一个方法 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 FAQ 的“什么是上下文界限?”部分。
此页面的贡献者
内容
- 简介
- Scala 特性
- 为什么选择 Scala 3?
- Scala 体验
- Hello, World!
- REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 一等函数
- 单例对象
- 集合
- 上下文抽象
- 顶级定义
- 摘要
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特性
- Scala 3 中的主方法
- 摘要
- 函数
- 匿名函数
- 函数变量
- Eta 展开
- 高阶函数
- 编写自己的 map 方法
- 创建返回函数的方法
- 摘要
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 摘要
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数即值
- 函数式错误处理
- 摘要
- 类型和类型系统
- 推断类型
- 泛型
- 交集类型
- 并集类型
- 代数数据类型
- 变异
- 不透明类型
- 结构类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- 上下文参数
- 上下文界限
- 给定导入
- 类型类
- 多重相等
- 隐式转换
- 摘要
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- 工作表
- 与 Java 交互
- 面向 Java 开发人员的 Scala
- 面向 JavaScript 开发人员的 Scala
- 面向 Python 开发人员的 Scala
- 下一步