参数字符串命名转换为scala中的代数类型

时间:2015-04-04 02:08:48

标签: scala

在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, ...)
}

1 个答案:

答案 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应该返回元组列表。