从Map [String,Type]生成案例类?

时间:2016-09-16 17:02:18

标签: scala code-generation shapeless

给定函数f,给定Map[String, MyType],返回HList

package net

import shapeless._

sealed trait MyType
case object MyInt extends MyType
case object MyStr extends MyType

object Mapper {

    def f(m: Map[String, MyType]): HList = m.foldLeft[HList](HNil){ (acc, elem) =>
        val (key, t) = elem
        t match {
            case MyInt => classOf[Int] :: acc
            case MyStr => classOf[String] :: acc
        } 
    }
}

我测试了它:

import net._
val list = Map("foo" -> MyInt, "bar" -> MyStr)

scala> Mapper.f(list)
res0: shapeless.HList = class java.lang.String :: int :: HNil

如何使用上述方法(或其他方法)构建case class,其成员与String键匹配,以及f输出所给出的类型?

所以,我正在寻找:

g(Map("foo" -> MyInt, "bar" -> MyStr))输出case class X(foo: Int, bar: String),其中X是任意选择的,即此时不重要。

我想过使用Generic[X],但我不知道如何在没有Generic的情况下获得case class

1 个答案:

答案 0 :(得分:2)

您尝试做的事情可以通过编译时验证在Scala中发生。这里的问题正如您所阐述的那样,您没有预先确定case class您尝试构建的定义。该定义提供了脚手架使用Record类型来构造同构。

也就是说,我们可能能够通过调用动态和反射来工作,但我还不清楚你如何在代码中利用它。你不会事先知道字段名称,也不知道它们的类型。那你怎么用它们编写代码呢?