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

use*_*956 1 scala

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

  x match {
    case <VALUE EXPR> => {}
  }
Run Code Online (Sandbox Code Playgroud)

例如

  x match {
    case (1+2) => {}
  }
Run Code Online (Sandbox Code Playgroud)

不允许,但是

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

  x match {
    case someval => {}
  }
Run Code Online (Sandbox Code Playgroud)

是.似乎如果允许第二种情况,那么第一种情况也是如此.

我正在尝试添加这样的映射列表:

  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
  }
Run Code Online (Sandbox Code Playgroud)

Tza*_*har 7

它只是蔑视的定义模式中的模式匹配.

Scala语言规范,第8章:

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

"表达式"不在此列表中,这有点意义 - 想一想 - 这个表达式何时会被评估?如果它有副作用,即使前面的情况用于返回结果,它是否会被评估?

一个有效的解决方法是使用一个防护,它评估:

x match {
  case i if i == (1+2) => {} // works as expected...
}
Run Code Online (Sandbox Code Playgroud)