gpt4 book ai didi

scala ADTs via sealed traits - 有没有办法以通用方式从字符串反序列化

转载 作者:行者123 更新时间:2023-12-01 10:21:52 25 4
gpt4 key购买 nike

假设我有以下特征

trait Named {
def name: String
}

和以下代数数据类型

sealed trait Animal extends Named

case object Dog extends Animal {
override val name: String = "dog man"
}

case object Cat extends Animal {
override val name: String = "cat man"
}

case object Owl extends Animal {
override val name: String = "I am an owl left in the dark"
}

现在,我可以使用以下方法将字符串实例反序列化到我的 Animal ADT 中。

object Animal {

def apply(name: String): Animal = name match {
case Dog.name => Dog
case Cat.name => Cat
}
}

@oxbow_lakes 在他的 answer 末尾提到那:

Can't instantiate easily from persisted value. This is also true but, except in the case of huge enumerations (for example, all currencies), this doesn't present a huge overhead.

我发现,当你添加一个新值时,它需要明确地添加到反序列化代码中,因为它容易出错(我认为编译器会警告我不完全匹配,但看看 Owlapply 方法 - 没有发出警告...)

没有更好的办法吗? (如果不是标准的 Scala 工具集,第三方工具集?)

最佳答案

enumeratum 库已经解决了这个问题: https://github.com/lloydmeta/enumeratum

你的代码可以这样写:

import enumeratum._
import enumeratum.EnumEntry.Lowercase

sealed trait Animal extends EnumEntry with Lowercase
object Animal extends Enum[Animal] {
val values = findValues

case object Dog extends Animal
case object Cat extends Animal
case object Owl extends Animal
}

val dogName = Animal.Dog.entryName
val dog = Animal.withNameInsensitive(dogName)

关于scala ADTs via sealed traits - 有没有办法以通用方式从字符串反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658748/

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