Scala - 值参数化的枚举

Scala - Enumeration with value parametrized

我想知道是否可以将具有一个值的枚举参数化。

类似于:

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"

也就是说,能够输入一些值,但保留一个值。

谢谢!!! 卢卡斯

我必须为抢先行动道歉。我在考虑 Java 术语,其中 enum 是非常严格的事情。然而,Scala 在这方面要灵活一些。 Enumeration 不会阻止我们自己扩展枚举 class。

免责声明:这可能不是一个好主意。它有效,但我不知道它在序列化或普通枚举具有的其他良好属性方面的表现如何。因此,如果它对您有用,那就太好了!但我不能保证这是一个好的解决方案。

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