• 有神论跟无神论的差别在哪你都不知道,还要扯啥呢。 2019-05-19
  • 央行就“金融改革与发展”答记者问 2019-05-10
  • 图书馆·情报与文献学 2019-05-10
  • 以专业认证推进落实管办评分离改革 2019-05-07
  • 投诉可以反投诉的,中国人人平等的。 2019-05-06
  • 寻找三秦非遗:二月二,大荔县阿寿村药王庙会赛花馍 2019-05-06
  • 计划不是产生在交换基础上的计划。 2019-05-05
  • 凤凰公映礼之《闪光少女》 2019-05-04
  • [中国新闻]韩朝军方商定重启陆海军事通信渠道 2019-05-02
  • 庆祝中国人民解放军建军90周年大会在京隆重举行 2019-05-02
  • 昌发展:母基金优势可利于构建一体化产业服务链条 2019-05-01
  • 第523期:土鸡蛋VS洋鸡蛋,哪个好?怎样挑? 2019-04-29
  • 十九大代表、海口市公安局琼山分局飞鹰大队大队长冯晖:把十九大精神讲清楚、讲明白 2019-04-25
  • 即使中美贸易归零,中国也不会屈服美国的大棒政策 2019-04-25
  • 沪上台企搭建创业平台 助力两岸青年文创交流 2019-04-24
  • 神奇公式秒杀全国11选5 www.bjux.net 聊聊 scala 的模式匹配

    1. 神奇公式秒杀全国11选5>
    2. 博客>
    3. 正文

    聊聊 scala 的模式匹配

    终日而思一 2018-11-15 10:44:56 浏览3186 评论1

    摘要: 一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 scala 的语言的一大利器。

    一. scala 模式匹配(pattern matching)

    pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 scala 的语言的一大利器。

    scala 的 pattern matching 是类似这样的,

    e match {
      case Pattern1 => do Something
      case Pattern2 if-clause => do others
      ...
    }

    其中,变量 e 后面接一个 match 以及一个代码块,其中每个 case 对应一种可能回匹配的类型,如果匹配成功则执行 => 后面的代码。

    我们可以用一个具体一些的例子来看看模式匹配是怎么工作的:

    case class Player(name: String, score: Int)
    def printMessage(player: Player) = player match {
      case Player(_, score) if score > 100000 =>
        println("Get a job, dude!")
      case Player(name, _) =>
        println("Hey, $name, nice to see you again!")
    }

    看起来有点类似于其他语言的 switch,但其实还是有很大的不同的。

    以java 的 switch 为例,java 的 switch 仅仅会做一些基本类型的匹配,然后执行一些动作,并且是没有返回值的。

    而 scala 的 pattern matching match 则要强大得多,除了可以匹配数值,同时它还能匹配类型。

    def parseArgument(arg: String) = arg match {
        //匹配值
        case "-h" | "--help" => displayHelp
        case "-v" | "--version" => displayVerion
        case whatever => unknownArgument(whatever)
    }
    def f(x: Any): String = x match {
        //匹配类型
        case i:Int => "integer: " + i
        case _:Double => "a double"
        case s:String => "I want to say " + s
    }
    

    同时 pattern matching 是有返回值的,比如上面的 match ,它返回的就是一个 Unit。我们也可以修改上面的代码让它返回一个字符串:

    case class Player(name: String, score: Int)
    def message(player: Player) = player match {
      case Player(_, score) if score > 100000 =>
        "Get a job, dude!"
      case Player(name, _) =>
        "Hey, $name, nice to see you again!"
    }

    值得一提的是, pattern matching 返回值是由第一个匹配的模式中的代码块决定的。

    二. 为什么要用 pattern matching

    看到这里你会发现一个问题, pattern matching 不是和if else 差不多吗?那为什么还要使用 pattern matching 呢?

    首先我们需要明白,模式匹配其实本质上是提供一个方便的解构 (Destructuring) 数据结构的方式,以 scala 为例, pattern matching 其实用到了 scala 中提取器的功能, 提取器其实就是类中的 unapply () 方法。

    trait User {
      def name: String
    }
    class FreeUser(val name: String) extends User
    object FreeUser {
      //提取器
      def unapply(user: FreeUser): Option[String] = Some(user.name)
    }
      val user: User = new FreeUser("Daniel")
      user match {
        case FreeUser(name) => println("it match here" + name)
        case _ => println("not me")
      }

    明白了模式匹配的本质你就会直到,其实 if else 只是 pattern matching 中的一个典型的用法,但并非它的全部。

    同时, pattern matching 允许你解耦两个并不真正属于彼此的东西,也使得你的代码更易于测试。比如上面的 match 部分的代码我们可以写成下面这样:

      val user: User = new FreeUser("Daniel")
      //将返回结果存在一个常量中
      val message = user match {
        case FreeUser(name) => "it match here" + name
        case _ => "not me"
      }
      //可以随意使用该常量,实现解耦
      println(message)

    这样会赋予代码更多的灵活性,同时也更加方便做进一步操作。

    而以可读性的角度来说,使用一大堆的 if else 代码无疑是比较难看的,而如果使用 pattern matching 的话,代码会简洁清晰很多,而简洁的代码则会更容易阅读。

    参考文章:

    https://doc.yonyoucloud.com/doc/guides-to-scala-book/chp3-pattern-everywhere.html

    https://www.zhihu.com/question/30354775

    【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用立即开通购买,限量从速!  详情请点击

    网友评论

  • 有神论跟无神论的差别在哪你都不知道,还要扯啥呢。 2019-05-19
  • 央行就“金融改革与发展”答记者问 2019-05-10
  • 图书馆·情报与文献学 2019-05-10
  • 以专业认证推进落实管办评分离改革 2019-05-07
  • 投诉可以反投诉的,中国人人平等的。 2019-05-06
  • 寻找三秦非遗:二月二,大荔县阿寿村药王庙会赛花馍 2019-05-06
  • 计划不是产生在交换基础上的计划。 2019-05-05
  • 凤凰公映礼之《闪光少女》 2019-05-04
  • [中国新闻]韩朝军方商定重启陆海军事通信渠道 2019-05-02
  • 庆祝中国人民解放军建军90周年大会在京隆重举行 2019-05-02
  • 昌发展:母基金优势可利于构建一体化产业服务链条 2019-05-01
  • 第523期:土鸡蛋VS洋鸡蛋,哪个好?怎样挑? 2019-04-29
  • 十九大代表、海口市公安局琼山分局飞鹰大队大队长冯晖:把十九大精神讲清楚、讲明白 2019-04-25
  • 即使中美贸易归零,中国也不会屈服美国的大棒政策 2019-04-25
  • 沪上台企搭建创业平台 助力两岸青年文创交流 2019-04-24
  • 新时时彩新时时彩 幸运飞艇现场直播 体彩p3开奖号今天晚上 排列五和值走势图带连线专业版 北京赛车软件 山东十一运夺金加奖 中国竞彩网app 双色球周日走势图 足彩半全场负负是什么 360足球比分直播 中国体育彩票超级大乐透 四川体育彩票 天津时时彩开奖结果记录表 七乐彩出七保六 体彩排列三试机号 重庆欢乐生肖什么意思