2015-05-27 34 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)