2015-07-24 3 views
2
val size: Int = o.getSize 

size match 
{ 
    case MyObject.Size.small.id => println("Small") 
    case MyObject.Size.medium.id => println("Medium") 
    case _ => throw ne UnknownSizeException 
} 

Не компилируется, я получаю странные ошибки в своей среде IDE, но это потому, что я использую градиент и много унаследованного Java-кода, который я должен постепенно обновлять.Scala match int на перечислении

Я все еще не уверен, почему это не работает. Малый имеет идентификатор 1, средний из 2.

Теперь, если я соответствовать следующим образом:

case s: MyObject.Size.small.id => println("Small") 

символ идентификатор не может быть решена.

Почему это?

Если я добавлю вручную 1 и 2, все работает как шарм.

редактировать

Я думаю, что одна проблема будет то, что .id начинается с нуля, в то время как мой размер начинается с 1 (имеет смысл здесь, как это фактический размер)

Но это само по себе может Это не проблема, не так ли? Потому что я все равно соглашусь.

Но как я мог преодолеть это?

case MyObject.Size.small.id + 1 => println("Won't work!") 

редактировать: Мой фактическое решение, благодаря Саше Кольберг

MyObject.Size(size+1) match 
{ 
    case MyObject.Size.SMALL => ... 
    ... 
} 
+2

Какой тип MyObject.Size.small.id? Причина второй проблемы (идентификатор символа) заключается в том, что вы сказали, что тип s - это MyObject.Size.small.id, который не является типом. –

ответ

5

Если вы используете Enumeration вы не можете соответствовать на Enumeration.Value.id потому, что это def и для сопоставления с образцом вам нужно стабильные идентификаторы, что в основном означает val.

Вы совпадают по значениям перечисления, поэтому попробуйте следующее:

MyObject.Size(size) match 
{ 
    case MyObject.Size.small => println("Small") 
    case MyObject.Size.medium => println("Medium") 
    case _ => throw new UnknownSizeException 
} 
Смежные вопросы