话说模式匹配(5) for表达式中的模式匹配

简介:

在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


目录
相关文章
NYOJ 5(模式匹配)
#include #include int substring(char str2[],char str1[],int count) { int i,j,k; int m,n; m=strlen(str2),n=strlen(str1); for(i=0;i
586 0
|
Scala 开发者
For 表达式的模式匹配 | 学习笔记
快速学习 For 表达式的模式匹配
|
算法 Java C++
字符串 模式匹配
要点 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。 假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。
996 0
|
存储 算法
字符串的模式匹配算法
一、串的比较 比较的是组成串的字符之间的编码(Unicode、ASCII) 二、串的抽象数据类型 串的逻辑结构和线性表相似,不同之处在于串针对的是字符集 对于基本操作,和线性表有区别: 线性表关注单个元素的操作,比如查找一个元素,插入删除操作 串更多的是查找子串的位置,得到指定位置的子串,替换子串...
|
算法 C语言
模式匹配算法
本文主要用C语言实现模式匹配算法。
158 2
模式匹配算法
|
7月前
正则表达式的限定符、或运算符、字符类、元字符、贪婪/懒惰匹配
本文介绍了正则表达式中的限定符、或运算符、字符类、元字符以及贪婪与懒惰匹配的概念和用法。
58 5