在某些情况下,可以省略在方法调用中你认为是重复的的某些参数。
这些参数之所以称为 上下文参数,是因为它们是由编译器从方法调用周围的上下文中推断出来的。
例如,考虑一个程序,该程序按两个条件对地址列表进行排序:城市名称,然后是街道名称。
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))
在本例中,Ordering.Tuple2(Ordering.String, Ordering.String)
实例正是编译器以其他方式推断的实例。
换句话说,这两个示例生成相同的程序。
上下文抽象 用于避免重复代码。 它们帮助开发人员编写可扩展且同时简洁的代码段。
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
- 下一步去哪