Eri*_*ric 12 macros scala scala-macros
我有以下宏定义一个类并返回该类的实例(使用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
"""}
}
Run Code Online (Sandbox Code Playgroud)
当我调用宏时:
case class Cat(name: String)
val t = test[Cat].method
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
method method in class Test cannot be accessed in Test
val t = test[Cat].method
^
Run Code Online (Sandbox Code Playgroud)
我的总体目标是使用吸血鬼方法并使用准引号来描述生成的类.我该如何解决这个错误?
Tra*_*own 11
在我关于吸血鬼方法的帖子中,我提到了这个bug的解决方法.出于某种原因,您当前无法在宏返回的实例上看到匿名类的方法,除非您创建一个使用方法扩展类的包装类并返回该实例.
你从一个稍微不同的角度看到同样的错误.您已使用要在返回的实例的结构类型上看到的方法命名该类,但您仍需要一个包装器.以下将有效:
c.Expr { q"""
class $className {
def method = 1
}
new $className {}
"""}
Run Code Online (Sandbox Code Playgroud)
请注意,我所做的就是在创建实例的行中添加一对括号,这样我就可以获得一个匿名类的实例$className而不仅仅是一个$className.
我不知道这个bug背后是什么,我不确定Eugene是否知道更多.我最近确认它仍然在2.11的最新版本中.
| 归档时间: |
|
| 查看次数: |
1222 次 |
| 最近记录: |