在 Scala 2 中,用 implicit classes 可以得到类似的结果。
扩展方法允许您在定义类型后向类型添加方法,即它们允许您向封闭类添加新方法。
例如,假设其他人创建了一个 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
在这段代码中:
- 扩展方法
circumference
将添加到Circle
类型里 c: Circle
语法允许您在扩展方法中引用变量c
然后在您的代码中使用 circumference
,就像它最初是在 Circle
类中定义的一样:
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
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
- 下一步去哪