- Scala 教程
- Scala - 首页
- Scala - 概述
- Scala - 特性
- Scala - 环境设置
- Scala - 构建工具 (SBT)
- Scala - 基本语法
- 数据类型和变量
- Scala - 数据类型
- Scala - 变量
- Scala - 字符串
- Scala - 数组
- Scala 运算符
- Scala - 运算符
- Scala - 算术运算符
- Scala - 关系运算符
- Scala - 逻辑运算符
- Scala - 位运算符
- Scala - 赋值运算符
- Scala 条件语句
- Scala - IF ELSE
- Scala 循环语句
- Scala - 循环语句
- Scala - while 循环
- Scala - do-while 循环
- Scala - for 循环
- Scala - break 语句
- Scala 类和对象
- Scala - 类和对象
- Scala - 访问修饰符
- Scala 方法和函数
- Scala - 函数
- Scala - 按名称调用函数
- Scala - 带命名参数的函数
- Scala - 带可变参数的函数
- Scala - 递归函数
- Scala - 默认参数值
- Scala - 高阶函数
- Scala - 嵌套函数
- Scala - 匿名函数
- 部分应用函数
- Scala - Currying 函数
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 映射
- Scala - 元组
- Scala - 迭代器
- Scala - 选项
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 异常处理
- Scala - 提取器
- Scala - 正则表达式
- Scala 文件 I/O
- Scala - 文件 I/O
- Scala 高级概念
- Scala - 闭包
- Scala - 特性
- Scala 有用资源
- Scala - 快速指南
- Scala - 在线编译器
- Scala - 有用资源
- Scala - 讨论
Scala - 提取器
Scala 中的提取器是一个对象,它有一个名为 unapply 的方法作为其成员之一。该 unapply 方法的目的是匹配一个值并将其分解。通常,提取器对象还定义了一个对偶方法 apply 用于构建值,但这不是必需的。
示例
让我们以一个定义了 apply 和 unapply 方法的对象为例。apply 方法的含义与往常一样:它将 Test 转换为可以应用于括号中参数的对象,就像应用方法一样。因此,您可以编写 Test("Zara", "gmail.com") 来构造字符串 "Zara@gmail.com"。
unapply 方法是将 Test 类转换为提取器的方法,它反转了apply 的构造过程。在 apply 采用两个字符串并从中形成电子邮件地址字符串的地方,unapply 采用电子邮件地址并返回可能两个字符串:地址的用户和域名。
unapply 还必须处理给定字符串不是电子邮件地址的情况。这就是为什么 unapply 返回字符串对的 Option 类型。其结果要么是Some(user, domain),如果字符串 str 是具有给定用户和域名部分的电子邮件地址,要么是 None,如果 str 不是电子邮件地址。以下是一些示例。
语法
unapply("Zara@gmail.com") equals Some("Zara", "gmail.com")
unapply("Zara Ali") equals None
以下示例程序显示了用于电子邮件地址的提取器对象。
示例
object Demo {
def main(args: Array[String]) {
println ("Apply method : " + apply("Zara", "gmail.com"));
println ("Unapply method : " + unapply("Zara@gmail.com"));
println ("Unapply method : " + unapply("Zara Ali"));
}
// The injection method (optional)
def apply(user: String, domain: String) = {
user +"@"+ domain
}
// The extraction method (mandatory)
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2){
Some(parts(0), parts(1))
} else {
None
}
}
}
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Apply method : Zara@gmail.com Unapply method : Some((Zara,gmail.com)) Unapply method : None
使用提取器的模式匹配
当类的实例后跟括号以及零个或多个参数的列表时,编译器将在该实例上调用apply 方法。我们可以在对象和类中定义 apply。
如上所述,unapply 方法的目的是提取我们正在寻找的特定值。它执行与apply相反的操作。当使用match语句比较提取器对象时,将自动执行unapply方法。
尝试以下示例程序。
示例
object Demo {
def main(args: Array[String]) {
val x = Demo(5)
println(x)
x match {
case Demo(num) => println(x+" is bigger two times than "+num)
//unapply is invoked
case _ => println("i cannot calculate")
}
}
def apply(x: Int) = x*2
def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
10 10 is bigger two times than 5