話說模式匹配(5) for錶達式中的模式匹配

杜老師說 2022-01-07 13:19:52 阅读数:634

模式 匹配 模式 匹配

在for錶達式中

for(x <- collection) { balabala } 

直覺上以為 x 就是個用於迭代每一個元素的局部變量。

我們看一些例子:

scala> for(i <- List(1,2,3) ) {println(i)}// 看看語法樹 scala> tb.parse("for(i <- List(1,2,3) ) {println(i)}")res2: tb.u.Tree = List(1, 2, 3).foreach(((i) => println(i)))

再多一點花樣,變量綁定:

scala> tb.parse("for([email protected] <- List(1,2,3) ) {println(i)}")res3: tb.u.Tree = List(1, 2, 3).withFilter(((check$ifrefutable$1) => check$ifrefutable$1: @scala.unchecked match { case (i @ 2) => true case _ => false })).foreach(((x$1) => x$1: @scala.unchecked match { case (i @ 2) => println(i)}))

將i綁定到常量模式2上,List(1,2,3)中只有2能匹配

下一個例子:

// 過濾出女性的名字scala> for ((name,"female") <- Set("wang"->"male","zhang"->"female") ) print(name)zhang

會在兩個點做模式匹配,第一個點是從Set中過濾符合條件的元素時,第二個點是對過濾後的集合迭代執行後續邏輯時。

scala> tb.parse("for ((name,\"female\") <- Set(\"wang\"->\"male\",\"zhang\"->\"female\") ) print(name)")res5: tb.u.Tree =Set("wang".$minus$greater("male"), "zhang".$minus$greater("female")).withFilter(((check$ifrefutable$2) => check$ifrefutable$2: @scala.unchecked match { case scala.Tuple2((name @ _), "female") => true case _ => false})).foreach(((x$2) => x$2: @scala.unchecked match { case scala.Tuple2((name @ _), "female") => print(name)}))

同樣,還可以類型模式在從集合過濾時按類型條件。

scala> for((k,v:Int) <- List(("A"->2),("B"->"C"))) {println(k)}A

原創文章,轉載請注明: 轉載自並發編程網 – ifeve.com本文鏈接地址: 話說模式匹配(5) for錶達式中的模式匹配

FavoriteLoading添加本文到我的收藏
版权声明:本文为[杜老師說]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071319517608.html