如何main()使用构造函数调用为 Haxe 类生成(访问)方法?
例如
static function main() new App()
function new() {
//....
}
Run Code Online (Sandbox Code Playgroud)
我想用宏创建它,如下所示:
import haxe.macro.Context;
import haxe.macro.Expr;
class Build {
macro public static function buildFields():Array<Field> {
var fields:Array<Field> = Context.getBuildFields();
var cls = Context.getLocalClass().get();
var pack = cls.pack.concat([cls.name]);
var name = pack.join(".");
fields.push({
name: "main",
access: [Access.APublic, Access.AStatic],
kind: FieldType.FFun({
expr: macro {
Type.createInstance(Type.resolveClass($v{name}), []);
},
args: [],
ret: null
}),
pos: Context.currentPos()
});
return fields;
}
}
Run Code Online (Sandbox Code Playgroud)
@:build(Build.buildFields())
class App {
function new() {
//....
}
}
Run Code Online (Sandbox Code Playgroud)
这可以main()很好地生成方法,但我不确定如何生成new App()而不是求助于Type.createInstance().
要生成类似的构造函数调用new App(),您可以haxe.macro.TypePath按照此处的说明进行具体化。
var typePath:haxe.macro.TypePath = {
pack: cls.pack,
name: cls.name
}
Run Code Online (Sandbox Code Playgroud)
expr: macro new $typePath(),
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我建议使用class reification,而不是像这样手动构建字段,它允许您使用常规的 Haxe 语法来声明字段:
fields = fields.concat((macro class {
public static function main() {
new $typePath();
}
}).fields);
Run Code Online (Sandbox Code Playgroud)