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

时间:2020-03-23 09:57:13

标签: scala scala-macros

我们已经为此花了很长时间,但找不到解决方案。 在我们的项目中,我们想编写一些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移植很多代码,并且希望给程序员一个模糊的想法,他们仍然在编写它。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

尝试

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