将两种匹配模式合二为一

Jac*_*ack 5 scala

如何结合(以一种很好的方式)两个Scala match'es?

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

myOption match {
  case Some(op) =>
    doSomethingWith(op)
  case None =>
    handleTheError()
Run Code Online (Sandbox Code Playgroud)

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

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

  }
  case "holiday" => {
    println("--Let's relax--")
  }
  case _ => {
    println("--Let's drink--")
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以这样组合它们:

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()
Run Code Online (Sandbox Code Playgroud)

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

更新

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

x match {
 case a => {
   y match {
    case c => {}
    case d => {}
   }
 }
 case b => {}
}
Run Code Online (Sandbox Code Playgroud)

等于

x -> y match {
  case a -> c => {}
  case a -> d => {}
  case b => {}
}
Run Code Online (Sandbox Code Playgroud)

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

4e6*_*4e6 9

你可以做

myOption map { success } getOrElse handleTheError
Run Code Online (Sandbox Code Playgroud)

或者scalaz,

myOption.cata(success, handleTheError)
Run Code Online (Sandbox Code Playgroud)

在哪里success是这样的

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--")      
  }
}
Run Code Online (Sandbox Code Playgroud)

更新

你的伪代码

x -> y match {
  case a -> c => {}
  case a -> d => {}
  case b => {}
}
Run Code Online (Sandbox Code Playgroud)

可以直译为scala as

(x, y) match {
  case (a, c) => {}
  case (a, d) => {}
  case (b, _) => {}
}
Run Code Online (Sandbox Code Playgroud)

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