scala:不可能匹配值表达式?

时间:2016-04-25 01:58:37

标签: scala

为什么不能在case语句中放置表达式? :

  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
  }

1 个答案:

答案 0 :(得分:7)

它完全违背了模式匹配中模式的定义。

来自Scala Language Specification,第8章:

  

模式是从常量,构造函数,变量和类型测试构建的

&#34;表达式&#34;不在这个列表中,这是有道理的 - 考虑一下 - 何时评估这个表达式?如果它有副作用,即使前面的情况用于返回结果,它是否会被评估?

有效的解决方法是使用后卫 进行评估:

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