从数组的参数创建案例 Class
Creating Case Class from parameters of an Array
我有一个字符串数组:EmpArray = Array(emp_id,emp_name,city)
而不是手动创建案例 class(比如 -- case Class Emp (val emp_id: String, val emp_name:String, val city:String)
我可以从数组本身创建一个案例class
case class Emp (EmpArray(0), EmpArray(1), EmpArray(2)) -- //hypothetical
在 scala 中可以做任何类似的事情吗?
如果您真的必须这样做,您可以通过运行时编译来完成:
import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox
def compileCaseClass(name: String, values: (String, String)*): Class[_] = {
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
val code = s"""
|case class $name(${values.map{case (n, t) => n + ": " + t}.mkString(",")})
|scala.reflect.classTag[$name].runtimeClass
""".stripMargin
println(code)
tb.compile(tb.parse(code))().asInstanceOf[Class[_]]
}
用法示例:
val arr = Array("emp_id", "emp_name", "city")
val types = Array.fill(3){"String"}
val emp = compileCaseClass("Emp", (arr zip types): _*)
val inst = emp.getConstructors.head.newInstance("foo", "bar", "baz")
println(inst)
它确实输出了 case-class 实例的通常 toString
:
Emp(foo,bar,baz)
请注意,它需要反射/编译器工具箱作为依赖项:如果你在 REPL 中或作为脚本,它就在那里 运行,但在普通项目中,你必须将它作为单独的依赖项添加。
我有一个字符串数组:EmpArray = Array(emp_id,emp_name,city)
而不是手动创建案例 class(比如 -- case Class Emp (val emp_id: String, val emp_name:String, val city:String)
我可以从数组本身创建一个案例class
case class Emp (EmpArray(0), EmpArray(1), EmpArray(2)) -- //hypothetical
在 scala 中可以做任何类似的事情吗?
如果您真的必须这样做,您可以通过运行时编译来完成:
import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox
def compileCaseClass(name: String, values: (String, String)*): Class[_] = {
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
val code = s"""
|case class $name(${values.map{case (n, t) => n + ": " + t}.mkString(",")})
|scala.reflect.classTag[$name].runtimeClass
""".stripMargin
println(code)
tb.compile(tb.parse(code))().asInstanceOf[Class[_]]
}
用法示例:
val arr = Array("emp_id", "emp_name", "city")
val types = Array.fill(3){"String"}
val emp = compileCaseClass("Emp", (arr zip types): _*)
val inst = emp.getConstructors.head.newInstance("foo", "bar", "baz")
println(inst)
它确实输出了 case-class 实例的通常 toString
:
Emp(foo,bar,baz)
请注意,它需要反射/编译器工具箱作为依赖项:如果你在 REPL 中或作为脚本,它就在那里 运行,但在普通项目中,你必须将它作为单独的依赖项添加。