zoukankan      html  css  js  c++  java
  • Scala进阶之路-Scala特征类与unapply反向抽取

              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 + "/" + bot
    19     }
    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             None
    35         } 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和b
    45         val a = Fraction.apply(10,100)
    46         val b = Fraction(2,3)
    47 
    48         //调用a的“*”的方法
    49         val c = a.*(b)          //当然,你也可以这样写 : val c = a * b
    50         println(c)
    51 
    52         //通过unapply方法将对象c中存储的值给抽取出来,分别复制给x和y
    53         val Fraction(x,y) = c
    54         println("分子 : "+x +" 分母 : " + y)
    55 
    56     }
    57 }
    58 
    59 
    60 /*
    61 以上代码执行结果如下 :
    62 20/300
    63 分子 : 20 分母 : 300
    64  */
  • 相关阅读:
    SPOJ GSS4 Can you answer these queries IV ——树状数组 并查集
    SPOJ GSS3 Can you answer these queries III ——线段树
    SPOJ GSS2 Can you answer these queries II ——线段树
    SPOJ GSS1 Can you answer these queries I ——线段树
    BZOJ 2178 圆的面积并 ——Simpson积分
    SPOJ CIRU The area of the union of circles ——Simpson积分
    HDU 1724 Ellipse ——Simpson积分
    HDU 1071 The area ——微积分
    HDU 4609 3-idiots ——FFT
    BZOJ 2194 快速傅立叶之二 ——FFT
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9366723.html
Copyright © 2011-2022 走看看