Scala编程基础28:Scala提取器

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容