Ответ 1
Вот подход, который работает: http://klangism.tumblr.com/post/7098500142/diy-exhaustiveness-checking-on-scala-enums
В Java у меня есть что-то вроде этого
public enum FlatFileHeaderMapping {
HEADER_EL(1),
HEADER_RESERVED1(5),
HEADER_RESERVED2(2),
HEADER_MESSAGE_TYPE(4)
public final int fieldSize;
private FlatFileHeaderMapping(int fieldSize) {
this.fieldSize = fieldSize;
}
}
который я могу затем использовать, помещает каждую строку в карту и позже получает доступ к ключам на карте через это перечисление (например, символы)
Перечисление не имеет такого качества, насколько я могу видеть, и классы case не упорядочены, как объявления перечисления, поэтому их нельзя использовать для сопоставления макета записи, как показано выше. По крайней мере, не без поддержки упорядоченной коллекции.
Я мог бы пропустить что-то очевидное, поэтому вопрос!
Спасибо
Луч
Вот подход, который работает: http://klangism.tumblr.com/post/7098500142/diy-exhaustiveness-checking-on-scala-enums
overthink является правильным, но существует менее верный способ объявления объектов case:
sealed abstract class FlatFileHeaderMapping(val fieldSize: Int)
case object HEADER_EL extends FlatFileHeaderMapping(1)
case object HEADER_RESERVED1 extends FlatFileHeaderMapping(5)
case object HEADER_RESERVED2 extends FlatFileHeaderMapping(2)
case object HEADER_MESSAGE_TYPE extends FlatFileHeaderMapping(4)
Вы можете попробовать использовать case object
s:
sealed trait FlatFileHeaderMapping { val fieldSize: Int }
case object HEADER_EL extends FlatFileHeaderMapping { val fieldSize = 1 }
case object HEADER_RESERVED1 extends FlatFileHeaderMapping { val fieldSize = 5 }
case object HEADER_RESERVED2 extends FlatFileHeaderMapping { val fieldSize = 2 }
case object HEADER_MESSAGE_TYPE extends FlatFileHeaderMapping { val fieldSize = 4 }
Затем вы можете использовать перечисление следующим образом:
object Test {
def foo(x: FlatFileHeaderMapping) {
val result =
x match {
case HEADER_EL => "it a HEADER_EL!"
case other => "its field size is: " + other.fieldSize
}
println(result)
}
def main(args: Array[String]) {
foo(HEADER_EL)
foo(HEADER_MESSAGE_TYPE)
}
}
Основная информация, которую вы получаете здесь, - это проверка времени компиляции, когда обрабатываются все значения перечисления. то есть в коде x match { ... }
выше вы получите ошибку компиляции, если у вас не было предложения 'case other = > ... `.
В основном я просто пересматриваю этот ответ, в котором перечислены плюсы и минусы этого подхода.
object Direction extends Enumeration {
val North = Value("North")
val East = Value("East")
val South = Value("South")
val West = Value("West")
}
scala> import Direction._
scala> values foreach println
scala> val map = HashMap(North -> 1, South -> 2)
На это отвечает Перечисление с помощью таблицы конструктора и поиска
Для целочисленного значения существует более простое решение:
object FlatFileHeaderMapping extends Enumeration {
type FlatFileHeaderMapping = Value
val HEADER_EL = Value(1, "HEADER_EL")
val HEADER_RESERVED1 = Value(5, "HEADER_RESERVED1")
val HEADER_RESERVED2 = Value(2, "HEADER_RESERVED2")
val HEADER_MESSAGE_TYPE = Value(4, "HEADER_MESSAGE_TYPE")
}