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