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

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

模式的種類(一)

上個例子顯示了幾種不同的模式:常量模式,通配模式,變量模式等,本篇逐個介紹模式的種類。

通配模式

通配符“_”可以用來匹配任意對象,通常在模式匹配中作為最后一個匹配項,匹配其它所有的輸入對象。比如:

    expr match {
        case BinOp(op,left,right) => println( expr + " is a binary operation")
        case _ =>
    }

通配模式也可以用來忽略一些你不打算處理的對象,比如本例,這關心輸入是否為一二元操作,其它的直接忽略。如果你不關心具體的操作符,左右操作符,可以直接使用通配符忽略這些部分,如:

    expr match {
        case BinOp(_,_,_) => println( expr + " is a binary operation")
        case _ =>
    }

常量模式

常量模式可以匹配和常量值本身相同的輸入。任意的字面量都可以作為常量模式。此外,所有的單例(singleton) 也可以作為常量模式。比如 Nil 可以匹配空列表。

    def describe(x:Any) =x match {
        case 5 => "five"
        case true => "truth"
        case "hello" => "hi!"
        case Nil => "the empty list"
        case _ => "something else"
    }

本例定義了多個常量模式,我們來看看一些測試結果:

    scala> describe (5)
    res0: String = five

    scala> describe(true)
    res1: String = truth

    scala> describe ("hello")
    res2: String = hi!

    scala> describe(Nil)
    res3: String = the empty list

    scala> describe(List(1,3,4))
    res4: String = something else

變量模式

一個變量模式可以匹配任意對象,在這一點上和通配符”_”一樣,但和通配符不同的是,Scala 將這個變量綁定到輸入的對象上,然后你在后面定義的表示中可以引用這個變量。比如下面代碼匹配 0,對于其它的對象使用了變量模式,這其后的表示中可以引用這個變量:

    def isZero(x:Any) = x match{
        case 0 => "zero"
        case somethingElse => "not zero:" + somethingElse
    }

    scala> isZero(0)
    res5: String = zero

    scala> isZero(1)
    res6: String = not zero:1

常量模式還是變量模式

常量模式可以采用符號名稱,比如前面定義的 Nil(它也是作為常量模式),這里給出另外一個相關的例子:

    E match {
      case Pi => "strange math? Pi =" + Pi
     case _ =>"OK"
    }

    scala> E match {
     | case Pi => "strange math? Pi =" + Pi
     |  case _ =>"OK"
     | }
    res7: String = OK

E 顯然不是 Pi,那么 Scala 編譯器如何知道 Pi 是個常量,而不是一個變量呢? Scala 編譯器使用一個簡單的規(guī)則來判斷:如果一個變量使用小寫字母開始,那么它作為一個變量模式,其它則做為常量模式。因此變量首字符的大小寫顯得非常重要。

如果我們重新定義 pi (小寫 p)

    scala> val pi=math.Pi
    pi: Double = 3.141592653589793

    scala> E match {
     | case pi => "strange math? Pi =" + Pi
     | }
    res9: String = strange math? Pi =3.141592653589793

次數(shù) pi 作為變量模式,它可以匹配任意輸入,因此可以匹配 E。 由于變量模式可以匹配任意的輸入,如果此時你再使用通配符,那么通配符不會被執(zhí)行到,因此系統(tǒng)會報錯。

    scala> E match {
      case pi => "strange math? Pi =" + Pi
              case _ => "OK"

      }
    <console>:10: warning: patterns after a variable pattern cannot match (SLS 8.1.1)
    case pi => "strange math? Pi =" + Pi
     ^
    <console>:11: warning: unreachable code due to variable pattern 'pi' on line 10
    case _ => "OK"

如果你還是想使用小寫字符開始的符號作為常量模式,有兩個方法,如果這個變量是某個對象的屬性,可以在這個變量前使用前綴,或者使用反單引號`,比如修改代碼如下:

    scala> E match {
      case `pi` => "strange math? Pi =" + Pi
              case _ => "OK"

      }

    res11: String = OK

使用了“的 pi 又作為常量模式來匹配輸入值。

上一篇:模式的種類(二)下一篇:Option 類型