加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将两种匹配模式合二为一

发布时间:2020-12-16 18:42:53 所属栏目:安全 来源:网络整理
导读:如何结合(以一种很好的方式)两个 Scala match’es? 首先,我必须测试Option是否是有效值: myOption match { case Some(op) = doSomethingWith(op) case None = handleTheError() 那么如果op有效,我想测试另一种模式: Path(request.path) match { case "wor
如何结合(以一种很好的方式)两个 Scala match’es?

首先,我必须测试Option是否是有效值:

myOption match {
  case Some(op) =>
    doSomethingWith(op)
  case None =>
    handleTheError()

那么如果op有效,我想测试另一种模式:

Path(request.path) match {
  case "work" => {
    println("--Let's work--")

  }
  case "holiday" => {
    println("--Let's relax--")
  }
  case _ => {
    println("--Let's drink--")
  }
}

我可以这样组合它们:

myOption match {
  case Some(op) =>
    doSomethingWith(op)
    Path(request.path) match {
      case "work" => {
        println("--Let's work--")          
      }
      case "holiday" => {
        println("--Let's relax--")
      }
      case _ => {
        println("--Let's drink--")
      }
    }
  case None =>
    handleTheError()

但是,它感觉很草率.是否有更好的方式以某种方式组合它们.

更新

道歉,我应该更好地解释.我实际上试图找出是否存在用于简化(或分解)这些控制结构的已知模式.例如(假设这是真的):

x match {
 case a => {
   y match {
    case c => {}
    case d => {}
   }
 }
 case b => {}
}

等于

x -> y match {
  case a -> c => {}
  case a -> d => {}
  case b => {}
}

如果有人已经确定了一些控制流的重构模式,那我只是在徘徊,就像代数中的2(x y)= 2x 2y

解决方法

你可以做

myOption map { success } getOrElse handleTheError

或者用scalaz,

myOption.cata(success,handleTheError)

成功就像是

def success(op: Whatever) = {
  doSomethingWith(op)
  Path(request.path) match {
    case "work"    => println("--Let's work--")
    case "holiday" => println("--Let's relax--")
    case _         => println("--Let's drink--")      
  }
}

更新

你的伪代码

x -> y match {
  case a -> c => {}
  case a -> d => {}
  case b => {}
}

可以直译为scala as

(x,y) match {
  case (a,c) => {}
  case (a,d) => {}
  case (b,_) => {}
}

如果内部匹配器只有很少的选项(在这种情况下为c和d),它看起来很好(这可能是你想要的),但它会导致代码重复(重复模式a).所以,一般来说,我更喜欢map {} getOrElse {},或者在较小的函数上分离模式匹配器.但我再说一遍,在你的情况下它看起来很合理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读