我们已经为此花了很长时间,但找不到解决方案。 在我们的项目中,我们想编写一些DSL来迁移代码库中的一些旧代码。
我们想创建一个宏,给定一个case类的实例,这使我们能够以类型安全的方式提取值。在这种情况下,应该可以将x声明为Int类型。
case class MyPersonalCaseClass(token: Int, str: String)
val someVariable = MyPersonalCaseClass(123, "SOMESTRING")
val x = Macros.->(someVariable, "token")
此处“ token”是一个编译时常量,指的是字段名称。 可以使用类似
的声明宏def ->[T](value:T,key: String): Any = macro MacrosImpl.arrow[T]
据我们了解,唯一的方法是使用白盒宏,请随时更改签名。
def arrow[T: c.WeakTypeTag](c: whitebox.Context)(value: c.Expr[T], key:c.Expr[String]): c.Expr[Any] =
{
import c.universe._
val caseClassType: c.universe.Type = weakTypeOf[T]
???
}
Scala版本为“ 2.12.8”。
之所以需要这样的原因是因为我们正在从perl移植很多代码,并且希望给程序员一个模糊的想法,他们仍然在编写它。
提前谢谢!
答案 0 :(得分:1)
尝试
import shapeless.LabelledGeneric
import shapeless.record._
LabelledGeneric[MyPersonalCaseClass].to(someVariable).get(Symbol("token")) // 123