2016-04-25 93 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清理起来:) –