gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:11:11 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com