2015-01-05 2 views
3

Могу ли я использовать коммутационный футляр для сопоставления рисунков на перечислениях?Могу ли я использовать @switch и Enumerations?

Я попытался

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 в enum с различны чем в Scala Enumeration. Еще не повезло.

Это @switch соответствие шаблону доступно только для примитивных типов?

ответ

1

Для завершения Regis ответа, в Scala В Depth, Джошуа Suereth утверждает, что следующий условия должны быть верны для применения Scala для оптимизации оптимизации таблиц:

  1. Соответствующее значение должно быть известным целым числом.
  2. Соответствующее выражение должно быть «простым». Оно не может содержать никаких проверок типов, если инструкции или экстракторы.
  3. Выражение должно также иметь значение, доступное во время компиляции.
  4. Должно быть более двух операторов case.

Объект Foo не соответствует ни одному из вышеуказанных критериев, хотя он не является предметом оптимизации таблиц.

1

Ссылка на примечание switch состоит в том, чтобы убедиться, что ваше совпадение составлено в команде tableswitch или lookupswitch JVM. Эти инструкции работают только на int, что означает, что аннотация switch будет иметь какое-либо влияние только на типы, которые могут безопасно вписываться в Int. Значение Int само по себе, а также Char, Byte, Short и Boolean. Кроме того, значения, которые вы сопоставляете, должны быть буквальными значениями (в отличие от значений, хранящихся в val). Учитывая, что Enumeration является опорным значением, они не совместимы с аннотацией switch. Ограничение по буквальным значениям фактически означает, что, вероятно, нет возможности использовать эту ennotation для Short и Byte по чисто синтаксическим соображениям, поскольку в scala нет поддержки литералов и байтов: вы должны использовать литерал int вместе с типом как указано в 123: Byte, но это не принято в качестве шаблона. Так что остается только Int, Char и Boolean в качестве допустимых типов (полезность использования @switch для логического значения является сомнительным, мягко говоря)

+0

Хотя Java-коммутатор на enum приводит к 'tableswitch' /' lookupswitch'. Но да, кажется, мои варианты: (1) написать Java, или (2), как вы сказали, использовать примитивный тип. –

+0

Важным отличием здесь является то, что перечисления Java имеют встроенную поддержку языка, а перечисление Scala чисто определено в стандартной библиотеке –

Смежные вопросы