此文档页面特定于 Scala 3,并且可能涵盖 Scala 2 中不可用的新概念。除非另有说明,此页面中的所有代码示例均假定您使用的是 Scala 3。
在 Scala 2 中,可以使用 隐式类 实现类似的结果。
扩展方法允许您在类型定义后向类型添加方法,即允许您向封闭类添加新方法。例如,假设其他人创建了一个 Circle
类
case class Circle(x: Double, y: Double, radius: Double)
现在假设您需要一个 circumference
方法,但您无法修改其源代码。在术语推理概念引入编程语言之前,您唯一能做的事情就是像这样在单独的类或对象中编写一个方法
object CircleHelpers {
def circumference(c: Circle): Double = c.radius * math.Pi * 2
}
object CircleHelpers:
def circumference(c: Circle): Double = c.radius * math.Pi * 2
然后您将像这样使用该方法
val aCircle = Circle(2, 3, 5)
// without extension methods
CircleHelpers.circumference(aCircle)
但是使用扩展方法,你可以创建一个 circumference
方法来处理 Circle
实例
extension (c: Circle)
def circumference: Double = c.radius * math.Pi * 2
在此代码中
Circle
是扩展方法circumference
将被添加到其中的类型c: Circle
语法让你可以在扩展方法中引用变量c
然后在你的代码中,你可以像在 Circle
类中最初定义的那样使用 circumference
aCircle.circumference
导入扩展方法
想象一下,circumference
在包 lib
中定义,你可以通过以下方式导入它
import lib.circumference
aCircle.circumference
如果缺少导入,编译器也会通过显示以下详细的编译错误消息来支持你
value circumference is not a member of Circle, but could be made available as an extension method.
The following import might fix the problem:
import lib.circumference
讨论
extension
关键字声明你即将在括号中放入的类型上定义一个或多个扩展方法。要对类型定义多个扩展方法,请使用此语法
extension (c: Circle)
def circumference: Double = c.radius * math.Pi * 2
def diameter: Double = c.radius * 2
def area: Double = math.Pi * c.radius * c.radius
此页面的贡献者
内容
- 简介
- Scala 特性
- 为什么选择 Scala 3?
- Scala 尝鲜
- 你好,世界!
- REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 一等函数
- 单例对象
- 集合
- 上下文抽象
- 顶级定义
- 总结
- 首次了解类型
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特性
- Scala 3 中的主方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 展开
- 高阶函数
- 编写你自己的 map 方法
- 创建返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 推断类型
- 泛型
- 交集类型
- 并集类型
- 代数数据类型
- 协变
- 不透明类型
- 结构类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- 上下文参数
- 上下文边界
- 给定导入
- 类型类
- 多重相等
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- 工作表
- 与 Java 交互
- 面向 Java 开发人员的 Scala
- 面向 JavaScript 开发人员的 Scala
- 面向 Python 开发人员的 Scala
- 下一步