比方說,我有以下特點Scala的抽象數據類型 - 是有沒有辦法從字符串中的一種通用的方式反序列化
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的結尾:
無法從持久價值容易實例。這也是如此,除了在大量列舉(例如所有貨幣)的情況下, , 這並不會帶來巨大的開銷。
我發現,當你添加一個新值時,它需要被顯式添加到反序列化代碼中,因爲容易出錯(我認爲編譯器會警告我一個詳盡的匹配,但要採取看上面的Owl
和apply
方法 - 沒有發出警告......)
有沒有更好的方法? (如果不符合標準的Scala工具包,第三方嗎?)
待辦事項我,回答我的問題。基於兩個帖子找到解決方案: http://stackoverflow.com/questions/25838411/cant-prove-that-singleton-types-are-singleton-types-while-generating-type-class 和 http:///stackoverflow.com/questions/43650265/implicit-arguments-how-to-encode-in-function-signature 總結爲:http://stackoverflow.com/a/43658710/101715 – Yaneeve