`
runanli
  • 浏览: 44345 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转][mark]话说模式匹配(5) for表达式中的模式匹配

阅读更多

转载自并发编程网 – ifeve.com 原文:http://ifeve.com/pattern-matching-5/

在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

 

分享到:
评论

相关推荐

    正则表达式之文本模式的匹配和查找

    我们想要按照特定的文本模式进行匹配或查找。 2、解决方案 如果想要匹配的只是简单的文字,那么通常只需要用基本的字符串方法就可以了,比如str.find()、str.endswith()、str.startswith()或类似函数。 示例: \...

    proposal-pattern-matching:ECMAScript的模式匹配语法

    Mark Cohen( ),Tab Atkins-Bittner(Google, ),Yulia Startsev(Mozilla, ),Daniel Rosenwasser(微软, ),Jack Works( Sujitech, ),Ross Kirsling(Sony, )问题有多种方法可以匹配语言中的值,...

    FormalTheory:PHP中的正则表达式(Regex),非确定性有限自动机(NFA)和确定性有限自动机(DFA)实现

    形式理论FormalTheory是一个允许对NFA,DFA和正则...重型单元测试范围现代自动加载支持通过规则进行正则表达式优化注意:FA是DFA或NFA 即将推出:trade_mark: 通过突变进行正则表达式优化基于正/负匹配列表的广义DFA求解

    Router:这个 PHP 类根据预定义的路由模式匹配 url

    提供添加具有匹配正则表达式的用户定义令牌的可能性。 从指定的路由名称反向生成 url。 版权和许可 麻省理工学院许可证 (MIT) 版权所有 (c) 2014 Mark Rolich 特此授予任何人免费获得本软件副本和相关文档文件...

    jdk-14_linux-x64_bin.rpm

    switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L -&gt;”模式匹配语法作用于不同范围并...

    jdk-13.0.1_windows-x64_bin.exe

    switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L -&gt;”模式匹配语法作用于不同范围并...

    matlab如何敲代码-structure_atlas:RT结构图集匹配工具

    第一个表达式匹配结构名称中包含的短语,而第二个表达式匹配排除的短语。 如果结构名称与包含语句匹配,而不与排除语句匹配,则认为它是匹配的。 可以将其他字段添加到每个图集结构,以指定有关该结构的其他属性(请...

    leetcode2sumc-leetcode-practice:LeetCode问题的解决方案

    正则表达式匹配 11 盛水最多的容器 :check_mark: 12 整数转罗马 , :check_mark: 13 罗马到整数 , , :check_mark: 14 最长公共前缀 :check_mark: 15 3总和 :check_mark: 16 3和最近 :check_mark: 17 电话号码的字母...

    leetcode530-leetcode:leetcode

    正则表达式匹配 难的 :cross_mark: 11 盛水最多的容器 中等的 :cross_mark: 12 整数转罗马 中等的 :cross_mark: 13 罗马到整数 简单的 :cross_mark: 14 最长公共前缀 简单的 :cross_mark: 15 3总和 中等的 :cross_...

    delete-old-packages:Github操作,用于删除Github软件包注册表中的旧版本的软件包

    删除旧包 Github操作,用于删除Github软件包注册表中的旧版本的软件包。 这与非常相似,但是针对不同的用例。 该操作通过获取最多20个软件包(每个软件包最多具有最... 版本的正则表达式模式 :cross_mark: :cross_

    Editplus 3[1].0

    括号在正则表达式中表示,文本中的字符匹配括号中任意一个字符即符合查找条件。 (3)按一下空格键,添加空格符。空格符是空行的一个组成成分。 (4)选择“制表符”,添加代表制表符的“\t”。 (5)移动光标,将...

    EditPlus 2整理信箱的工具

    括号在正则表达式中表示,文本中的字符匹配括号中任意一个字符即符合查找条件。 (3)按一下空格键,添加空格符。空格符是空行的一个组成成分。 (4)选择“制表符”,添加代表制表符的“\t”。 (5)移动光标,将...

    jflex:具有完全Unicode支持的Java:trade_mark:快速扫描程序生成器

    它生成词法分析器的Java源,该词法分析器读取输入,将输入与spec文件中的正则表达式进行匹配,如果正则表达式匹配,则运行相应的操作。 词法分析器通常是编译器中的第一步,它匹配关键字,注释,运算符等,并为解析...

    ember-text-highlight:简单高效的Ember.Helper,突出显示文本的匹配部分

    灰烬文字突出显示 此插件公开了一个简单的 ,它使用可样式化CSS类( mark )在span中包装文本的匹配部分。 它选择了可能在当前环境中表现最佳的算法,使其速度比使用正则表达式的惯用实现快两倍。用法选择一种安装...

    Hacking Vim

    表达式寄存器: “= (使用:输入表达式后ENTER, p粘贴) 2.17折迭 zfa{ 创建折迭 zc 折迭 zo 打开折迭 zM 折迭所有 zR 打开所有折迭 2.18文件比较vimdiff :vimdiff file1 file2 :diffsplit filename 或命令行下 vim...

    leetcode530-leetcode-practice:练习力码

    正则表达式匹配 11 盛水的容器 12 整数转罗马 13 罗马到整数 15 3 和 电话号码的 17 个字母组合 18 4 和 20 个有效括号 22 生成括号 23 合并k个排序列表 26 从排序数组中删除重复项 27 删除元素 28 实现 strStr() 29...

    JSTL详解--Core 标签库介绍

    在 developerworks 上其新系列的第一篇文章中,软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素。您还将了解如何通过从表示层删除源代码来简化软件维护。最后,您将了解 ...

    visual-regexp.el:具有交互式视觉反馈的Emacs的regexpreplace命令

    在小型缓冲区中构造正则表达式时,您会获得有关比赛(包括小组比赛)的实时视觉反馈: 在微型缓冲区中构造替换项时,您将获得替换项的实时视觉反馈: 它可以用于一次性替换所有匹配项(例如replace-regexp ),也...

Global site tag (gtag.js) - Google Analytics