2015-05-27 87 views
4

考虑下面代码:scala是否支持许多模式匹配的默认子句?

val first = ... 
val second = ... 
val third = ... 
val fours = ... 

first match { 
    case "someString" => second match { 
    case s:String => third match { 
     case MyEnum.A => //some logic 
     case MyEnum.B => fours match { 
     case Some(old:String) => //some other logic 
     case default=> defaulLogic 
     } 
     case default=> defaulLogic 
    } 
    case default=> defaulLogic 
    } 
    case default=> defaulLogic 
} 

private def defaulLogic()= { 
    //log error here 
} 

有没有把case default逻辑到一个地方,而不是在每一个模式匹配复制它的一种方式?

注意

目前只有match-case statments顶部,其实有更多的案件。

回答

8

我将重写代码,使其更易于阅读:

(first, second, third, fours) match { 
    case ("something", s: String, MyEnum.A, _) => //some logic 
    case ("something", s: String, MyEnum.B, Some(old)) => //some other logic 
    case _ => defaulLogic 
} 

如果你这样写,默认的情况下,将以更自然的方式书写。

-1

不是最优雅的想法,但...

try { 
    first match { 
    case "someString" => second match { 
     case s:String => third match { 
     case MyEnum.A => //some logic 
     case MyEnum.B => fours match { 
      case Some(old:String) => //some other logic 
     } 
     } 
    } 
    } 
} catch { 
    case me : MatchError => defaultLogic 
} 
+0

将尝试捕捉切服务表现? – Cherry

+0

只有在没有匹配的情况下才抛出MatchError。如果跌破很少,那就会很快。如果fall through是常见的情况,那么构造MatchError,捕获堆栈跟踪和捕获的开销可能很重要。 –

+0

这很危险。这个异常可能在'some logic'块内被抛出,然后它不应该被'defaultLogic'处理。 –

-1

这是一个比较优雅:)

Try{ 
    first match { 
    case "someString" => second match { 
    case s:String => third match { 
     case MyEnum.A => //some logic 
     case MyEnum.B => fours match { 
     case Some(old:String) => //some other logic 
     } 
    } 
    } 
}.getOrElse(defaultLogic)