我想将案例类定义提供给工具箱,以便稍后在进行评估时使用它们。工具箱应该能够知道案例类的定义。
例如, 我可以使用 args email 定义一个名为 Authentication 的案例类
import scala.reflect.runtime._
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
val cm = universe.runtimeMirror(getClass.getClassLoader)
val toolBox = cm.mkToolBox()
val myClass: ClassDef = q"case class Authentication(email: String)".asInstanceOf[ClassDef]
val definedClass = toolBox.define(myClass)
println(definedClass)
它打印
class Authentication
然后我想将它召回到我的 Eval 表达式中并匹配它
val myCode =
q""" def myFunction(x:Any){
x match{
case Authentication(param) => println("Auth received!")
}
}"""
toolBox.eval(myCode)
但它告诉我,未找到身份验证。 知道如何实现它吗?
由于
.apply
和 .unapply
是伴生对象的方法,因此您错过了 .companion
,类似于 Scala 反射:如何在运行时定义案例类,然后引用它?
尝试
val myCode =
q"""
def myFunction(x: Any) = {
x match{
case ${definedClass.companion}(param) => println("Auth received!")
}
}
myFunction(${definedClass.companion}("111@aaa"))
"""
toolBox.eval(myCode) // Auth received!