我正在尝试重构 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/