我正在尝试使用@:build
和@:autoBuild
宏向类及其子类的所有实例添加一个静态变量和一个静态函数。
我设法让静态变量工作,但我不知道如何从各种EFunction
、EFor
等“构建”函数。
以下是我到目前为止拥有的代码:
macro static public function addGetId() :Array<Field>
{
var fields : Array<Field> = Context.getBuildFields();
// The static _id field
var idField = {
name : "_id",
doc : null,
meta : [],
access : [AStatic, APrivate],
kind : FVar(macro : Int, macro -1),
pos : Context.currentPos()
};
// The getId function field
var getIdField = {
name : "getId",
doc : "Returns the ID of this command type.",
meta : [],
access : [AStatic, APublic],
kind : FFun({
params : [],
args : [],
expr: // What do I have to write here???
ret : macro : Int
}),
pos : Context.currentPos()
};
fields.push(idField);
fields.push(getIdField);
return fields;
}
下面是我想要添加的函数在普通代码中的样子,如果它实际上位于.hx文件中:
public static function getId() : Int
{
if (_id == -1)
{
_id = MySingleton.getInst().myGreatFunction()
}
return _id;
};
因此,它引用了新添加的_id
变量以及一些单例类函数。
那么:完整的getIdField()
会是什么样子呢?
奖励问题:
我最大的问题是完全缺乏关于这些特性的文档,以及手册中任何有用的示例。有没有真正有用的教程来创建这样的函数呢?
奖金问题:
在FFun
中,params
和args
有什么区别
发布于 2016-01-24 19:35:24
您可以使用reification编写函数体,就像在常规Haxe代码中一样:
expr: macro {
if (_id == -1) {
_id = 0;
}
return _id;
},
params
是类型参数的列表,args
是函数接收的参数列表。有一个关于这个on the Haxe Manual的琐事部分
琐事:参数与参数
在其他一些编程语言中,参数实参和参数可以互换使用。在Haxe中,参数用于引用方法,参数用于引用。
https://stackoverflow.com/questions/34974996
复制相似问题