Scala 密封特征 - 复制枚举 `withName` 方法

标签 scala

我正在尝试重构 Enumeration到具有具体类的密封特征,因为我需要将更多功能打包到它们中。使用密封特性,我希望具有类似于 Enumeration 的功能。的 withName(String)方法。我想出了以下代码来这样做并正在寻找反馈:

sealed trait Foo {
  def name: String
}

object Foo {
  case object FooA extends Foo {
    override val name: String = "a"
  }

  case object FooB extends Foo {
    override val name: String = "b"
  }

  val values = Seq(FooA, FooB)

  def withName(name: String): Option[Foo] = {
    values.find(value => value.name.equals(name))
  }
}

然后我可以使用 withName(String)获取类型Foo对应的具体对象的方法作为 Option :
val testFooAName = "a"
val testFooA = Foo.withName(testFooAName) // Will yield Some(FooA)

testFooA match {
    case Some(Foo.FooA) => println("Matched Foo.FooA!")
    case Some(Foo.FooB) => print("Matched Foo.FooB!")
}

val testFooNoneName = "none"
val testFooNone = Foo.withName(testFooNoneName) // Will yield None

Output:
Matched Foo.FooA!

这种方法是否正确?

最佳答案

是的,看起来不错

小幅简化:有一个 map 可以快速查找

val values = Seq(FooA, FooB)
val fastLookup = values.map(v => v.name -> v).toMap

def withName(name: String): Option[Foo] = fastLookup.get(name)

关于Scala 密封特征 - 复制枚举 `withName` 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52085642/

相关文章:

scala - 从光滑表定义创建表

java - 如何在 Scala Swing 应用程序中使用 scala.swing.Applet?

scala - 使用自定义名称 Play WebSocketActor createHandler

scala - akka - 测试特定的日志条目

Scala 脚本不能在 Ubuntu 上运行

scala - Option.toRight 返回产品类型。这是什么意思?

scala - Akka - 是否有可能在 Actor 的主管中收到有关它失败的消息?

scala - 为什么 Scala 方法 isInstanceOf[T] 不起作用

scala - Slick 3.1.1 模糊隐式值涉及过滤器和隐式 CanBeQueryCondition

Scala 单位类型,斐波那契递归深度函数