2014-09-20 63 views
0

如果有人能用簡單的英語解釋這種行爲,我會非常感激。具體來說,case _:Foocase Foo()之間有什麼區別?案件類別匹配

myvariable match { 
    case _: Foo => println("its a foo!") 
    case Foo() => println("It's also a Foo") 
    case Foo => println("Oops, this will *not* match a Foo! It will never be called") 
    case _ => println("This will be called for all unmatched items") 
} 

回答

4

這是一個正常的類型匹配,有點像Java中的instanceOf。

case x: Foo => ??? 

它保證你可以在右手邊

case Foo(a,b,c) => ??? 

用x表示一個Foo在另一方面試圖取消應用調用(你免費獲得一個案例類),並允許你「到達」實例,並捕獲所有字段作爲你可以在右側使用的vals。

備註:定義一個不帶字段的case類與使用case對象基本相同,這是大多數人在Scala中只是表示一個可能的值。所以,你的第二個案例是有點怪,可能寧願使用情況的對象來完成:

case object Foo 

case Foo => ??? 
+0

唉唉我現在明白了,'情況美孚()'實際上是調用'Foo.unapply',但因爲它是一個空的參數列表沒有任何提取。我知道第三個案例有點奇怪,但我認爲這是一個常見的錯誤,所以我想把它作爲一個「哎呀」,用於閱讀 – Hamy 2014-09-20 18:06:44

+1

@Hamy第三個案例根本不奇怪 - 當你想要時你會這樣做匹配*值*,而不是結構。因此,如果你有一個「密封特質」的情況,就像johanandren所暗示的那樣,它沒有攜帶任何數據,你可以將它作爲一個「case object」並且以這種方式匹配。你也可以通過這種方式來匹配文字值。還有另一種類型的案例,它使用反引號來匹配先前定義的變量。 – acjay 2014-09-21 00:37:25

+0

@acjay - 當然,所有偉大的建議。也許奇怪的是錯誤的詞,我的意思是我認爲人們經常會把'case Foo'和'case Foo()'混淆起來,沒有意識到前者可能沒有按照他們的意圖去做。例如,請參閱http://stackoverflow.com/questions/2254710/why-were-the-case-classes-without-a-parameter-list-deprecated第一個答案提到這種混淆 – Hamy 2014-09-21 01:27:00