Scala进阶之路-Scala特征类与unapply反向抽取
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Scala特征类分析
1>.Unit
答:用于定义返回值类型,它的值只有一个,即"()",它有点类似于Java的void,只不过Java的返回值没有变现形式。
2>.null
答 :一般多用于Scala语法赋值时默认的空值,比如:“var blog:String = _”,那么变量中blog的值就为null。
3>.Nothing
答:Nothing是Scala语言中所有类的子类,它是没有具体的值的,比如:Nil = List[Nothing]
4>.Option
答:其有两个实现子类,即None和Some两个继承类,None表示不存在,可以给任何数据类型赋值,经查看null的源码case object None extends Option[Nothing],
二.apply快速构造对向与unapply反向抽取
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 9 class Fraction(var top:Int , var bot :Int) {10 //定义一个方法,方面名称叫"*"11 def *(f1:Fraction) = {12 //调用单例模式中的apply方法13 Fraction.apply(this.top * f1.top , this.bot * f1.bot)14 }15 16 //重写toString方法17 override def toString: String = {18 top + "/" + bot19 }20 }21 22 23 object Fraction{24 //定义静态方法,如果不指定默认会调用该方法25 def apply(a:Int , b:Int)= {26 //通过构造方法初始化“class Fraction”对象27 new Fraction(a, b)28 }29 30 //反向抽取31 def unapply(f:Fraction):Option[Tuple2[Int,Int]] = {32 //如果分母为0就返回Option的None实现类33 if(f.bot == 0) {34 None35 } else {36 //如果分母不为0就返回Option的Some实现类37 Some(new Tuple2[Int,Int](f.top,f.bot))38 }39 }40 }41 42 object app{43 def main(args: Array[String]): Unit = {44 //生产两个“class Fraction”对象a和b45 val a = Fraction.apply(10,100)46 val b = Fraction(2,3)47 48 //调用a的“*”的方法49 val c = a.*(b) //当然,你也可以这样写 : val c = a * b50 println(c)51 52 //通过unapply方法将对象c中存储的值给抽取出来,分别复制给x和y53 val Fraction(x,y) = c54 println("分子 : "+x +" 分母 : " + y)55 56 }57 }58 59 60 /*61 以上代码执行结果如下 :62 20/30063 分子 : 20 分母 : 30064 */