2016-04-25 75 views
1

爲什麼不能在case語句中放置表達式? :scala:不可能匹配值表達式?

x match { 
    case <VALUE EXPR> => {} 
    } 

例如

x match { 
    case (1+2) => {} 
    } 

是不允許的,但

val someval = (1+new java.util.Random().nextInt()) 

    x match { 
    case someval => {} 
    } 

是。看起來,如果第二種情況是允許的,第一種情況也是如此。

我想補充的映射列表如下:

val typ:Type = symbol.typeSignature 

    typ match { 
    case typeOf[collection.immutable.List[Any]] => { return a function to handle this type } 
    case typeOf[...] => {} 
    case typeOf[...] => {} 
    ... many 
    } 
+2

注意'情況下someval'不會做你希望的,因爲它創建了一個新的,它會匹配任何東西變量。要改變這一點,你需要大寫變量名或用反引號包圍它。 –

回答

7

它只是違背了模式模式匹配的定義。

Scala Language Specification,第8章:

圖案從常量,構造函數,變量和型式試驗

「表達式」內置不在此名單,這有一定道理 - 考慮一下 - 何時評估這個表達?如果它有副作用,即使它之前的情況用於返回結果,它也會被評估嗎?

一個有效的解決方法是使用後衛,這評價:

x match { 
    case i if i == (1+2) => {} // works as expected... 
} 
+0

thx fr清理起來:) –