在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ 模式的種類(三)
模式的種類(三)
模式限定修飾
簡(jiǎn)單的示例
模式的種類(二)
模式無(wú)處不在
模式的種類(四)
Sealed Classes
Option 類型
重疊模式定義
模式的種類(一)

模式的種類(三)

類型模式

你可以使用類型模式匹配來(lái)代替類型檢查和類型轉(zhuǎn)換。比如:

    def generalSize(x:Any) = x match{
        case s:String => s.length
        case m:Map[_,_] =m.size
        case _ => -1
    }

函數(shù) generalSize 返回某些對(duì)象長(zhǎng)度或是大小。它的參數(shù)類型為 Any,因此可以傳入任意類型的數(shù)據(jù)。模式 s:String 為一類型模式,匹配任意類型為 String 的非空對(duì)象。變量 s 為匹配的字符串。

第二個(gè)匹配 m:Map[,] 匹配任意類型的 Map 對(duì)象,這里我們不關(guān)心具體的 key 和 value,因此使用通配符_,如果你需要在后面表達(dá)式中使用 key,value,可以使用 key,value 替換掉_。

對(duì)于 Map 類型的數(shù)據(jù),我們能否匹配指定 Key 或 value 類型的數(shù)據(jù)呢,比如:

    def  isIntIntMap(x:Any) = x match {
        case m:Map[Int,Int]=>true
        case _ => false
    }

此時(shí)編譯器會(huì)給出警告:

    <console>:9: warning: non-variable type argument Int in type pattern Map[Int,Int] is unchecked since it is eliminated by erasure
       case m:Map[Int,Int]=>true
      ^
    isIntIntMap: (x: Any)Boolean

Scala 和 Java 類似對(duì)于 generic 類采用了 ”type erasure”,也就是說(shuō)運(yùn)行時(shí)不保存 Map 的 Key 和 Value 的類型,因此我們無(wú)法匹配指定類型 Key 或 Value 的 Map 對(duì)象。
我們可以看到

    scala> isIntIntMap(Map(1->1))
    res14: Boolean = true

    scala> isIntIntMap(Map("a"->"b"))
    res15: Boolean = true

這兩個(gè)都返回 true,這個(gè)和預(yù)期不同,因此對(duì)于這種情況,編譯器會(huì)給出警告,pattern Map[Int,Int] 中的類型不起作用。

但有一個(gè)特例,數(shù)組和一般的 generic 處理不同,它支持匹配元素類型。比如:

    def isStringArray(x:Any) = x match{
        case a:Array[String]=>"yes"
        case _ => "no"
    }

測(cè)試結(jié)果如下:

    scala> val as =Array("abc")
    as: Array[String] = Array(abc)

    scala> isStringArray(as)
    res16: String = yes

    scala> val ai = Array(1,2,3)
    ai: Array[Int] = Array(1, 2, 3)

    scala> isStringArray(ai)
    res17: String = no