我們在前幾天介紹了很多種pattern來比對物件,不過有時候仍然會有比對不夠精準的時候,這時候就可以使用pattern guard來更具體的比對。
Pattern guard的用法是在pattern後加上if
接著任意的布林運算式。
當我們只想要比對一個pattern,但前提是這個pattern必須符合額外的一些標準時
x match
case a if 0 to 9 contains a => println("0~9:" + a)
case b if 10 to 19 contains b => println("10~19:" + b)
case c if 20 to 29 contains c => println("20~29:" + c)
or
x match
case i if x==1 => "x is 1"
case i if (x==2 || x==3) => println(x)
case _ => "others"
在variable-binding pattern下,case i if (x==2 || x==3) => println(x)
也可以改成case i @ (2|3) => println(i)
有時候我們想在pattern內加一個變數,我們可以這樣表示:
case variableName @ => ...
它的概念是當我們輸入一個變數到match運算式時,它會去跟模式比對,如果比對成功了輸入變數就會跟variableName
綁定。
假設原本有個List pattern像這樣:
case List(1, _*) => "starts with 1"
這是在比對一個開頭元素為1的List
我們知道也可以這樣表示:
case list: List[_] => s"$list"
這時我們會想說它應該也能跟sequencem pattern結合
像這樣:
case list: List(1, _*) => s"$list"
這時編譯器會出現error
解法是加一個變數綁定模式到sequence pattern
case list @ List(1, _*) => s"$list"