gpt4 book ai didi

scala - 如何生成静态成员并将其添加到类型宏中的类?

转载 作者:行者123 更新时间:2023-12-04 15:59:39 25 4
gpt4 key购买 nike

我想将一个静态字段(在本例中名为 bar)添加到一个具有类型宏(名为 Foo )的类(名为 Static )中。

这就是我目前正在尝试这样做的方式:


import language.experimental.macros
import scala.reflect.macros.Context

package object statics {

type Static = macro Statics.addStaticField

object Statics {

def addStaticField(c: Context): c.Tree = {
import c.universe._

val STATIC = 1 << 23
type CompilerSymbol = scala.tools.nsc.Global#Symbol
def setFlag(symbol: Symbol, flag: Long) {
val compilerSymbol = symbol.asInstanceOf[CompilerSymbol]
println("Setting flag ...")
compilerSymbol.setFlag(flag)
}
def printFlags(symbol: Symbol) {
println("Flags: " + symbol.asInstanceOf[CompilerSymbol].flagString)
}

val staticField: ValDef =
ValDef(
mods = Modifiers(),
name = TermName("bar"),
tpt = TypeTree(),
rhs = Literal(Constant(42))
)
printFlags(staticField.symbol)
setFlag(staticField.symbol, STATIC)
printFlags(staticField.symbol)

val Template(parents, _, existingCode) = c.enclosingTemplate

Template(Nil, emptyValDef, staticField :: existingCode)
}
}
}

在编译期间,调用 setFlag似乎有效果,因为标志字符串发生了变化:
Flags: 
Setting flag ...
Flags: <static>

但它在使用站点上似乎根本没有实际效果:
package statics

class Foo extends Static

object Main extends App {
Foo.bar // Fails to compile
(new Foo).bar // Compiles
}
showshowRaw不要显示 STATIC 的任何迹象, 也。

我该如何解决这个问题?

最佳答案

据我所知,您需要生成一个伴生对象才能拥有静态字段,而目前使用类型宏是不可能的。

关于scala - 如何生成静态成员并将其添加到类型宏中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14463463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com