2011-02-15 117 views
16

我試圖用一個匹配替換我的isInstanceOf檢查,但它不起作用。斯卡拉匹配錯誤

在我的方法中,我檢查一個樹節點 - 如果它是一片樹葉 - 我想立即將它返回到一個Vector中,如果不是,我繼續使用該方法。

所以我原本:

//code here 
    if (common.isInstanceOf[LeafNode]) { 
     return Vector(common.asInstanceOf[LeafNode].data) 
    } 
    //code here 

然後我試圖取代它:

//code here 
    common match { 
     case leaf: LeafNode => return Vector(leaf.data) 
    } 
    //code here 

,但我得到scala.MatchError。

回答

21

如果您的common不是LeafNode,您將收到MatchError。您的ifmatch表達式不等效。我認爲,最直接的方式,使他們相當於是:

common match { 
    case leaf: LeafNode => return Vector(leaf.data) 
    case _ => 
} 

但我建議在看整個代碼塊,並制定出有做這個工作更多的功能的方式。也就是說,沒有中間的return。還記得那場比賽是一個表達式,所以這樣的事情是可能的:

def foo = { 
    //code here 
    common match { 
    case leaf: LeafNode => Vector(leaf.data) 
    case notLeaf: Branch => //code here 
    } 
} 
5

問題是您的match區塊中的一組病例並非詳盡無遺;如果common不是LeafNode,則會引發MatchError。您可以通過具有像這樣一個包羅萬象的情況下解決這個問題:

common match { 
    case leaf: LeafNode => return Vector(leaf.data) 
    ... // other cases 
    case other => ... // what to do if nothing else matches 
} 

這是類似於default情況下在Java switch語句。 other案件被稱爲「無可辯駁的模式」,因爲它沒有特徵;它不需要特定的類型或構造函數,因此它總是能夠匹配任何符合它的東西。變量的名稱不一定是other,它可以是任何你想要的,甚至是_ ......實際上你不需要在這裏綁定一個新的變量,因爲它將與common相同。

從樣式上來看,在match塊中放置返回語句通常是不好的形式;整個塊是一個表達式,它的計算結果就是它的一種情況,所以只需返回整個表達式即可。此外,根本不需要使用return關鍵字,因爲函數定義中的最後一個表達式將用作結果。

+0

約回報好一點,謝謝其實 – drozzy 2011-02-15 06:31:38

+0

,如果你在你的函數返回語句,斯卡拉2.9編譯器會強迫你明確說明函數的返回類型。不知道有關早期版本,雖然 – Aaron 2011-08-18 20:55:40