iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
自我挑戰組

連續30天 初學者介紹Scala語言系列 第 25

[Day 25]Scala Pattern Matching Part3

  • 分享至 

  • xImage
  •  
  • Pattern guard
  • Variable binding

今天要來介紹Pattern guard

我們在前幾天介紹了很多種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)

來聊聊Variable-binding pattern

有時候我們想在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"

上一篇
[Day 24]Scala Pattern Matching Part2
下一篇
[Day 26]Scala Sealed class
系列文
連續30天 初學者介紹Scala語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言