2011-06-26 60 views
25

你可以寫:| |如何| (管道)在模式匹配工作?

str match { case "foo" | "bar" => ... } 

在它看起來像|乍一看可能是提取物,但是:

str match { case |("foo", "bar") => ... } 

不起作用。 (而且我也看不出如何實現這一點。)

那麼它是一個神奇的內置運算符?

(我相信我此之前看到的這個問題,但它無法搜索...)

+1

這裏是[示例](http://stackoverflow.com/questions/6384073/catching-multiple-exceptions-at-on-ce-scala/6385333#6385333)。 – agilesteel

回答

24

是管道(|)是內置的模式匹配(請參閱the scala language reference)。模式匹配部分(第8節)在第8.1.11節中定義了所謂的模式替代方案。定義如下:

模式替代p1 | ... | pn 由多個替代 模式pi組成。所有可選模式 都使用該模式的預期 類型進行了類型檢查。它們可能不會綁定 變量,而不是通配符。該 替代模式的值v 如果至少一個及其替代 匹配訴

所以,是的,管道是相匹配的內置也就是上下文模式匹配敏感。

35

|沒有在庫中實現,它是由Scala編譯器解釋。它建立一個被定義爲沒有任何綁定變量(雖然新形成的圖案本身可以綁定2子模式之間的分離的新格局,即你可以寫這樣的東西

try { /*...*/ } 
catch { 
    case e @ (_: IOException | _: IllegalArgumentException) => /*...*/ 
} 

e得到的鍵入列出的替代品中最具體的超類型)。