作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始学习 Scala 编译时反射,并且通过 Scala 官方指南向我介绍了 quasiquotes。
我仍在努力解决的一个概念是,如果我想为已定义的对象生成 AST,我应该如何使用 quasiquotes(或 reify
,就此而言)。假设我有一个对象:
object MyObject {
def method1() = "m1"
}
q"""{object MyObject {
def method1() = "m1"
}}
"""
object MyObject {
def method1() = "m1"
}
q"$MyObject" // or q"{MyObject}", I still don't fully understand the table on the Scala guide
最佳答案
准报价
q"""{object MyObject {
def method1() = "m1"
}}
"""
reify{
object MyObject {
def method1() = "m1"
}
}.tree
Block(
List(
ModuleDef(Modifiers(), TermName("MyObject"),
Template(
List(Select(Ident(scala), TypeName("AnyRef"))),
noSelfType,
List(
DefDef(Modifiers(), termNames.CONSTRUCTOR, List(), List(List()), TypeTree(),
Block(List(pendingSuperCall), Literal(Constant(())))
),
DefDef(Modifiers(), TermName("method1"), List(), List(List()), TypeTree(),
Literal(Constant("m1"))
)
)
)
)
),
Literal(Constant(()))
)
context.parse
可以获得相同的结果(编译时)/
toolBox.parse
(运行时)来自普通
String
val str: String =
"""object MyObject {
| def method1() = "m1"
|}""".stripMargin
toolBox.parse(str)
MyObject
在
object MyObject {
def method1() = "m1"
}
MyObject
在
q"""{object MyObject {
def method1() = "m1"
}}
"""
Liftable
的实例。
object MyObject {
def method1() = "m1"
}
implicit val myObjectLiftable: Liftable[MyObject.type] = new Liftable[MyObject.type] {
override def apply(value: MyObject.type): Tree =
q"""
object MyObject {
def method1() = "m1"
}"""
}
q"""
class SomeClass {
$MyObject
}"""
def foo[A](a: A) = macro impl[A]
def foo[A] = macro impl[A]
foo(MyObject)
或
foo[MyObject.type]
和里面
def impl[A: c.WeakTypeTag](c: blackbox.Context)...
weakTypeOf[A]
,然后是它的符号。拥有符号,您可以拥有方法等的签名。
关于scala - 如何对先前定义的对象使用 quasiquotes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62458950/
我是一名优秀的程序员,十分优秀!