在许多情况下,上下文参数 的名称不必显式提及,因为它仅在编译器为其他上下文参数合成实参的时候用到。 在这种情况下,您不必定义参数名称,只需提供参数类型即可。
背景
例如,假设一个 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 常见问题解答的 “什么是上下文绑定?” 部分。
Contributors to this page:
Contents
- 导言
- Scala 3 特性
- 为什么是 Scala 3 ?
- Scala 的味道
- Hello, World!
- The REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 头等函数
- 单例对象
- 集合
- 上下文抽象
- 顶层定义
- 总结
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 领域建模
- 函数式领域建模
- 方法
- 方法特性
- main 方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 扩展
- 高阶函数
- 自定义 map 函数
- 创建可以返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 类型推断
- 泛型
- 相交类型
- 联合类型
- 代数数据类型
- 型变
- 不透明类型
- 结构化类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- Given 实例和 Using 语句
- 上下文绑定
- Given 导入
- 实现类型类
- 多元相等性
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- worksheet
- 与 Java 交互
- 向 Java 开发者介绍Scala
- Scala for JavaScript Developers
- Scala for Python Developers
- 下一步去哪