本文共 1313 字,大约阅读时间需要 4 分钟。
在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(i@2 <- 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
文章转自
转载地址:http://ejtta.baihongyu.com/