这Type Builder example在Haxe Manual发现(粘贴下面以供参考,但有在链路更好的描述)是向类中添加一个函数的一个很好的简单例子。
添加属性将大致相同。我添加了一个跟踪(场)循环,以帮助他们是如何定义的感受:
Main.hx
@:build(TypeBuildingMacro.build("myFunc"))
class Main {
static public function main() {
trace(Main.myFunc); // my default
}
}
TypeBuildingMacro.hx
import haxe.macro.Context;
import haxe.macro.Expr;
class TypeBuildingMacro {
macro static public function build(fieldName:String):Array<Field> {
var fields = Context.getBuildFields();
for (field in fields) { trace(field); }
var newField = {
name: fieldName,
doc: null,
meta: [],
access: [AStatic, APublic],
kind: FVar(macro : String, macro "my default"),
pos: Context.currentPos()
};
fields.push(newField);
return fields;
}
}
注意Main.hx必须调用带有@:build
元数据的宏,因此编译器知道在处理Main类本身之前运行宏(它添加了函数)。
嗨佛朗哥,我看了一下 - 唉,它很迷惑。 我也看过https://github.com/back2dos/tinkerbell/blob/master/src/tink/lang/macros/PropBuilder.hx,但它做了很多事情,它真的不能回答我更基本的问题。例如为什么所有的小叮当类实现“tink.lang.Cls”或者宏系统如何对“@:xxx”做出反应?为什么会触发宏观系统? “@:prop”和类PropBuilder之间的关联又是什么?我无法找到任何信息 – robkuz