Scala - 具有参数化值的枚举

时间:2018-03-21 22:05:23

标签: scala types enumeration

我想知道是否可以使用一个值参数化的枚举。

类似的东西:

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"

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

谢谢! 卢卡斯。

1 个答案:

答案 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