在某些情况下,你可以省略一些被认为是重复的方法调用的参数。
这些参数被称为上下文参数,因为它们是由编译器从方法调用周围的上下文中推断出来的。
例如,考虑一个按两个条件对地址列表进行排序的程序:城市名称,然后是街道名称。
val addresses: List[Address] = ...
addresses.sortBy(address => (address.city, address.street))
sortBy
方法采用一个函数,该函数为每个地址返回一个值,以便将其与其他地址进行比较。在这种情况下,我们传递一个函数,该函数返回包含城市名称和街道名称的元组。
请注意,我们只指定比较什么,但没有指定如何执行比较。排序算法如何知道如何比较 String
元组?
实际上,sortBy
方法采用第二个参数——一个上下文参数——由编译器推断。它没有出现在上面的示例中,因为它是由编译器提供的。
第二个参数实现了如何比较。省略它很方便,因为我们知道 String
通常使用字典顺序进行比较。
但是,也可以显式传递它
addresses.sortBy(address => (address.city, address.street))(Ordering.Tuple2(Ordering.String, Ordering.String))
addresses.sortBy(address => (address.city, address.street))(using Ordering.Tuple2(Ordering.String, Ordering.String))
在 Scala 3 中,在 sortBy
的参数列表中 using
表示显式传递上下文参数,避免歧义。
在这种情况下,Ordering.Tuple2(Ordering.String, Ordering.String)
实例正是编译器推断出的实例。换句话说,这两个示例都生成相同的程序。
上下文抽象 用于避免重复代码。它们帮助开发人员编写可扩展且简洁的代码片段。
此页面的贡献者
内容
- 简介
- Scala 特性
- 为什么选择 Scala 3?
- Scala 简介
- Hello, World!
- REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 一类函数
- 单例对象
- 集合
- 上下文抽象
- 顶级定义
- 总结
- 首次了解类型
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特性
- Scala 3 中的主方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 展开
- 高阶函数
- 编写自己的 map 方法
- 创建返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 推断类型
- 泛型
- 交集类型
- 并集类型
- 代数数据类型
- 协变
- 不透明类型
- 结构类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- 上下文参数
- 上下文界限
- Given 导入
- 类型类
- 多重相等
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- 工作表
- 与 Java 交互
- 面向 Java 开发者的 Scala
- 面向 JavaScript 开发者的 Scala
- 面向 Python 开发者的 Scala
- 下一步