Scala提取器就是一个带有unapply方法的对象。unapply方法时apply方法的反向操作:unapply方法接收一个对象,然后从中提取出值,提取的值通常是用来构造该对象的值。
1.Scala提取器的定义和使用
以下实例演示了邮件地址的提取器对象:
object Test1 {
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"));
}
def apply(user:String, domain:String) = {
user + "@" + domain;
}
def unapply(str:String):Option[(String,String)]={
val parts = str split "@";
if(parts.length == 2){
Some(parts(0),parts(1));
}else{
None;
}
}
}
编译并执行以上代码,输出结果如下:
E:\Test>scalac Test1.scala
E:\Test>scala Test1
apply() method : Zara@gmail.com
unapply() method : Some((Zara,gmail.com))
unapply() method : None
以上对象定义了两个方法:apply和unapply方法。实现了apply方法,Test1类无需new操作就可以创建对象:如可以通过语句Test1(“Zara”,”gmail.com”)就可以构造一个字符串对象”Zara@gmail.com”。而unapply方法是apply方法的反向操作:unapply方法接受一个对象,然后从对象中提取值,如上例中提取用户名和邮件地址后缀。
2.提取器使用模式匹配
当实例化一个类时,可以带上0个或者多个参数,编译器在实例化时会调用apply方法。当在提取器对象中使用match语句时,unapply方法将自动执行:
object Test2 {
def main(args:Array[String]){
val x = Test2(5);
println(x);
x match {
case Test2(num) => println(x + " is double of " + num);
case _ => println("can not be calucated");
}
}
def apply(x:Int) = {
x*2;
}
def unapply(z:Int):Option[Int] = {
if(z%2==0){
Some(z/2);
}
else{
None;
}
}
}
编译并执行以上代码,输出结果如下:
E:\Test>scalac Test2.scala
E:\Test>scala Test2
10
10 is double of 5