3

我可以使用 switch-case 对枚举进行模式匹配吗?

我试过了

import scala.annotation.switch

object Foo extends Enumeration {
  val First = Value
  val Second = Value
  val Third = Value
}

object Main {
  def foo(x: Foo.Value) = (x: @switch) match {
    case Foo.First => 1
    case Foo.Second => 2
    case Foo.Third => 3
  }
}

但收到以下警告(Scala 2.11.4):

warning: could not emit switch for @switch annotated match
  def foo(x: Foo.Value) = (x: @switch) match {

然后我尝试用 Java 定义枚举,因为 Java 的enums 不同于 Scala 的Enumeration. 仍然没有运气。

@switch模式匹配仅适用于原始类型?

4

2 回答 2

1

为了完成 Regis 的回答,Joshua Suereth 在 Scala In Depth 中指出,Scala 应用 tableswitch 优化必须满足以下条件:

  1. 匹配的值必须是已知整数。
  2. 匹配的表达式必须是“简单的”。它不能包含任何类型检查、if 语句或提取器。
  3. 表达式还必须具有在编译时可用的值。
  4. 应该有两个以上的案例陈述。

Foo 对象不符合上述任何标准,尽管它不是 tableswitch 优化的主题。

于 2015-01-25T03:58:52.760 回答
1

注释的重点switch是确保您的匹配项被编译为tableswitchJVMlookupswitch指令。这些指令仅适用于整数,这意味着switch注释只会对可以安全地放入Int. 意味着它Int本身以及Char,Byte和. 此外,您匹配的值必须是文字值(与存储在 a 中的值相反)。鉴于 an是参考值,它们与注释不兼容。对字面值的限制实际上意味着可能无法将这种注解用于andShortBooleanvalEnumerationswitchShortByte, 纯粹出于句法原因,因为 scala 中不支持文字短裤和字节:您必须使用文字 int 以及 in 中的类型归属123: Byte,但这不被接受为模式。所以只剩下Int,Char并且Boolean作为有效类型(@switch至少可以说,用于布尔值的有用性是值得怀疑的)

于 2015-01-05T10:28:36.943 回答