2011-07-08 52 views
4

Scala有模式匹配可能性的完整規範嗎?Scala有模式匹配可能性的完整規範嗎?

我無法修復下面的代碼:

something match { 
    case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => { 
     doSomething(e) 
    } 
    ... 
    } 

(它不會在2.8.1編譯。)

+0

不是最具描述性的或有幫助的問題標題......它非常含糊,除非他們現在感到無聊,否則人們可能會滾過去。實際上,身體的第一行應該是更好的標題(「Scala的模式匹配可能性是否有完整的規範?」)。 –

+0

標題更新.. –

+0

給我們一些關於什麼是不工作的線索。編譯錯誤?運行時錯誤的結果?例外? –

回答

4

我不確定我會這樣寫代碼;它很難遵循(除了不以其原始形式工作)。

我寧願去的東西像

def doSomething(e: Exception) = { /* whatever */ } 
something match { 
    case sae: ServerApiException if (sae.statusCode == 401) => doSomething(sae) 
    case ue: UnauthorizedException => doSomething(ue) 
} 

,以避免重複的代碼。或者您可以使用以下選項:

(something match { 
    case sae: ServerApiException if (sae.statusCode == 401) => Some(sae) 
    case ue: UnauthorizedException => Some(ue) 
    case _ => None 
}).foreach(e => /* do something */) 

如果您更喜歡之後編寫該方法。但我認爲第一種方式可能是最清晰的。

+0

選項如何幫助我? –

+0

這些選項可以讓你編寫'(something match {/ * blah * /})。foreach(e =>/* whatever * /)',其中_only_匹配並轉換成Some(x)它通過'foreach'步驟中的'e'傳遞。 「無」情況將無能爲力。因此,選項/ foreach方法與def方法完全相同,只是步驟順序不同,並且保證不能將doSomething方法用於其他任何方法(因爲它不是「 t命名 - 它僅僅是第二種情況下'e =>'後的代碼)。 –

+0

但是如何處理其他情況(...)? –

4

Chapter 8 of the Scala Language Spec? (pdf)

更具體地說,this answer可能會有些幫助的,那是你應該能夠做這樣的事情:

case e: Exception if e.isInstanceOf[UnauthorizedException] || (e.isInstanceOf[ServerApiException] && e.asInstanceOf[ServerApiException].statusCode == 401) => { 
    doSomething(e) 
} 
+0

它不編譯,因爲'Exception'沒有'statusCode'成員。 –

+0

@TN:編輯添加顯式強制轉換,並實際嘗試編譯此版本。幾乎沒有最漂亮的代碼,雖然... – ig0774

+0

+1 Thx提示。 –

3

最後,我設法與Scala語言規格(斯卡拉語法摘要)的幫助:

something match { 
    case e: Exception if (e match { 
     case sae: ServerApiException if sae.statusCode == 401 => true 
     case _: UnauthorizedException => true 
     case _ => false 
    }) => { 
     doSomething(e) 
    } 
    ... 
    } 
+0

我比我領導的方向更好。 – ig0774

+0

我想實際的上下文可能會更復雜,但這個具體的例子可能更直截了當,因爲匹配{case sae:ServerApiException,如果sae.statusCode == 401 => doSomething(sae);案例ue:UnauthorizedException => doSomething(ue); }' –

+0

是的,實際代碼'doSomething'更復雜,因此我正在尋找一個'更好的'解決方案。 –