Scala有模式匹配可能性的完整規範嗎?Scala有模式匹配可能性的完整規範嗎?
我無法修復下面的代碼:
something match {
case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => {
doSomething(e)
}
...
}
(它不會在2.8.1編譯。)
Scala有模式匹配可能性的完整規範嗎?Scala有模式匹配可能性的完整規範嗎?
我無法修復下面的代碼:
something match {
case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => {
doSomething(e)
}
...
}
(它不會在2.8.1編譯。)
我不確定我會這樣寫代碼;它很難遵循(除了不以其原始形式工作)。
我寧願去的東西像
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 */)
如果您更喜歡之後編寫該方法。但我認爲第一種方式可能是最清晰的。
選項如何幫助我? –
這些選項可以讓你編寫'(something match {/ * blah * /})。foreach(e =>/* whatever * /)',其中_only_匹配並轉換成Some(x)它通過'foreach'步驟中的'e'傳遞。 「無」情況將無能爲力。因此,選項/ foreach方法與def方法完全相同,只是步驟順序不同,並且保證不能將doSomething方法用於其他任何方法(因爲它不是「 t命名 - 它僅僅是第二種情況下'e =>'後的代碼)。 –
但是如何處理其他情況(...)? –
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)
}
它不編譯,因爲'Exception'沒有'statusCode'成員。 –
@TN:編輯添加顯式強制轉換,並實際嘗試編譯此版本。幾乎沒有最漂亮的代碼,雖然... – ig0774
+1 Thx提示。 –
最後,我設法與Scala語言規格(斯卡拉語法摘要)的幫助:
something match {
case e: Exception if (e match {
case sae: ServerApiException if sae.statusCode == 401 => true
case _: UnauthorizedException => true
case _ => false
}) => {
doSomething(e)
}
...
}
我比我領導的方向更好。 – ig0774
我想實際的上下文可能會更復雜,但這個具體的例子可能更直截了當,因爲匹配{case sae:ServerApiException,如果sae.statusCode == 401 => doSomething(sae);案例ue:UnauthorizedException => doSomething(ue); }' –
是的,實際代碼'doSomething'更復雜,因此我正在尋找一個'更好的'解決方案。 –
不是最具描述性的或有幫助的問題標題......它非常含糊,除非他們現在感到無聊,否則人們可能會滾過去。實際上,身體的第一行應該是更好的標題(「Scala的模式匹配可能性是否有完整的規範?」)。 –
標題更新.. –
給我們一些關於什麼是不工作的線索。編譯錯誤?運行時錯誤的結果?例外? –