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  */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM