Scala:Typesafe宏,用于提取case类字段的值



我们已经为此绞尽脑汁了一段时间,但我们找不到解决方案。在我们的项目中,我们想写一些DSL来迁移我们代码库中的一些旧代码。

我们希望制作一个宏,在给定case类的实例的情况下,可以以类型安全的方式提取值。在这种情况下,应该可以声明Int.类型的x

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移植大量代码,我们想给程序员一个模糊的想法,他们仍在写它

提前感谢!

尝试

import shapeless.LabelledGeneric
import shapeless.record._
LabelledGeneric[MyPersonalCaseClass].to(someVariable).get(Symbol("token")) // 123

最新更新