12

我有以下宏定义一个类并返回该类的一个实例(使用 Scala 2.10.2 和宏插件):

def test[T] = macro testImpl[T]

def testImpl[T : c.WeakTypeTag](c: Context): c.Expr[Any] = {
  import c.universe._
  val className = newTypeName("Test")

  c.Expr { q"""
    class $className  {
      def method = 1
    }
    new $className
  """}
}

当我调用宏时:

case class Cat(name: String)

val t = test[Cat].method

我收到以下错误:

method method in class Test cannot be accessed in Test
val t = test[Cat].method
                   ^

我的总体目标是使用吸血鬼方法并使用准引号来描述生成的类。我该如何解决这个错误?

4

1 回答 1

11

在我关于吸血鬼方法的帖子中,我提到了这个错误的解决方法。由于某种原因,您目前无法在从宏返回的实例上看到匿名类的方法,除非您创建一个包装类,该类使用方法扩展类并返回其实例。

您从稍微不同的角度看到了相同的错误。你已经用你想在返回实例的结构类型上看到的方法命名了这个类,但你仍然需要一个包装器。以下将起作用:

  c.Expr { q"""
    class $className  {
      def method = 1
    }
    new $className {}
  """}

请注意,我所做的只是在创建实例的行中添加一对括号,这样我就得到了一个匿名类的实例,$className而不仅仅是一个$className.

我不知道这个错误的背后是什么,我不确定尤金是否知道更多。我最近确实确认它仍然存在于最新的 2.11 版本中。

于 2013-08-28T10:10:55.150 回答