- Scala Tutorial
- Scala - Home
- Scala - Overview
- Scala - Environment Setup
- Scala - Basic Syntax
- Scala - Data Types
- Scala - Variables
- Scala - Classes & Objects
- Scala - Access Modifiers
- Scala - Operators
- Scala - IF ELSE
- Scala - Loop Statements
- Scala - Functions
- Scala - Closures
- Scala - Strings
- Scala - Arrays
- Scala - Collections
- Scala - Traits
- Scala - Pattern Matching
- Scala - Regular Expressions
- Scala - Exception Handling
- Scala - Extractors
- Scala - Files I/O
- Scala Useful Resources
- Scala - Quick Guide
- Scala - Useful Resources
- Scala - Discussion
Scala - 提取器
Scala 中的提取器是一个对象,其成员之一有一个名为unapply的方法。unapply 方法的目的是匹配一个值并将其拆开。通常,提取器对象还定义用于构建值的双重方法,但这不是必需的。
例子
让我们举一个对象定义apply和unapp方法的例子。apply 方法具有与往常相同的含义:它将 Test 转换为一个对象,该对象可以以与应用方法相同的方式应用于括号中的参数。所以你可以编写Test("Zara","gmail.com")来构造字符串“Zara@gmail.com”。
unapply方法将 Test 类变成了提取器,并且反转了apply的构造过程。apply 接受两个字符串并从中形成一个电子邮件地址字符串,unappy 接受一个电子邮件地址并可能返回两个字符串:用户和地址的域。
unapply还必须处理给定字符串不是电子邮件地址的情况。这就是为什么 unapply 在字符串对上返回 Option 类型。如果字符串 str 是具有给定用户和域部分的电子邮件地址,则其结果为Some (user, domain) ;如果 str 不是电子邮件地址,则结果为 None。以下是一些示例。
句法
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