使用 Scala Toolbox 是否可以定义一个案例类并在以后将其用于 eval 代码中?

问题描述 投票:0回答:1

我想将案例类定义提供给工具箱,以便稍后在进行评估时使用它们。工具箱应该能够知道案例类的定义。

例如, 我可以使用 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)

但它告诉我,未找到身份验证。 知道如何实现它吗?

java scala reflection toolbox
1个回答
1
投票

由于

.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!
© www.soinside.com 2019 - 2024. All rights reserved.