我想知道是否可以使用一个值参数化的枚举。
类似的东西:
object Animal extends Enumeration {
val Dog = Value("dog")
val Cat = Value("cat")
val Other = Value(?)
def create(value: String): Animal.Value = {
Animal.values.find(_.toString == value).getOrElse(Other(value))
}
}
并且,使用时,例如:
create("dog") // will return Animal.Dog
create("giraffe") // will return Animal.Other
create("dog").toString // will return "dog"
create("giraffe").toString // will return "giraffe"
也就是说,能够键入一些值,但保留一个值。
谢谢! 卢卡斯。
答案 0 :(得分:3)
我要为跳枪道歉。我用Java来思考,enum
是一个非常严格的事情。然而,Scala在这方面更灵活一些。 Enumeration
并不会阻止我们自己扩展枚举类。
免责声明:这可能不是一个好主意。它可以工作,但我不知道它在序列化或普通枚举的其他好的属性方面的表现如何。所以,如果它适合你,太棒了!但我不能保证这是一个好的解决方案。
object Animal extends Enumeration {
val Dog = Value("dog")
val Cat = Value("cat")
def create(value: String): Animal.Value = {
Animal.values.find(_.toString == value).getOrElse(OtherAnimal(value))
}
}
// Extending the enumeration class by hand and giving it a `String` argument.
case class OtherAnimal(name: String) extends Animal.Value {
override def id = -1
override def toString = name
}
println(Animal.create("dog").toString) // dog
println(Animal.create("cat").toString) // cat
println(Animal.create("giraffe").toString) // giraffe