在scala中,我有一个我想使用的代数类型:
case class Person(name: String, age: Int, weight: Float)
我无法控制的库通过枚举String值为我提供值:
Enumeration(("name", "Bob"), ("age", "32"), ("weight", "45.64"))
Enumeration(("age", "23"), ("weight", "20.0"), ("name", "Alice"))
将烦人的(名称,值)字符串对放入我的案例类中最“scala-ish”的方法是什么?
我只想到了明显的迭代CRUD方法:
def toClass(e: Enumeration[(String,String)]): Person = {
var name: String = _
...
for(pair <- e) pair._1 match {
"name" => name = pair._2
}
Person(name, ...)
}
答案 0 :(得分:2)
只需将其转换为地图:
def toClass(e : Enumeration[(String,String)]) : Person = {
val raw = e.values.toMap
Person(raw("name"), raw("age").toInt, raw("weight").toFloat)
}
还有基于宏的universal solution
P.S。我认为您的Enumeration
是一种自定义类型,因为scala Enumeration
没有采用类型参数,也无法保存元组列表(实际上是can ,但这不是使用它的经典方式)。所以e.values
应该返回元组列表。