Создание Case Class из параметров массива - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть массив строк: EmpArray = Array(emp_id,emp_name,city)

Вместо того, чтобы вручную создавать класс дел (скажем, - case Class Emp (val emp_id: String, val emp_name:String, val city:String)

, можно ли создать класс дел из самого массива

case class Emp (EmpArray(0), EmpArray(1), EmpArray(2)) -- //hypothetical

может ли что-либо подобное в scala возможно?

1 Ответ

0 голосов
/ 22 декабря 2018

Если вам действительно нужно, вы можете сделать это с помощью компиляции во время выполнения:

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)

это действительно выводит обычный toString экземпляра класса case:

Emp(foo,bar,baz)

Обратите внимание, что для него требуется набор инструментов отражения / компилятора в качестве зависимости: он есть, если вы запускаете его в REPL или в виде скрипта, но в обычных проектах,Вы должны добавить его как отдельную зависимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...