Macros 如何为属性扩展创建宏
我想编写自己的宏来在Haxe中创建类似属性的对象。 这个问题与其说是关于属性,不如说是关于编写宏。 (可能NME已经有了一个宏) 在haxe上这门课Macros 如何为属性扩展创建宏,macros,haxe,Macros,Haxe,我想编写自己的宏来在Haxe中创建类似属性的对象。 这个问题与其说是关于属性,不如说是关于编写宏。 (可能NME已经有了一个宏) 在haxe上这门课 class Foo { @:property var bar:String; } 我想把这个扩展到 class Foo { private var bar:String; public function setBar(_val:String):void { this.bar = _val; }
class Foo {
@:property var bar:String;
}
我想把这个扩展到
class Foo {
private var bar:String;
public function setBar(_val:String):void {
this.bar = _val;
}
public function getBar():String {
return this.bar;
}
}
我读了相应的文档,但老实说,我发现它们非常混乱
谢谢您可能想看看tinkerbell是如何解决同一问题的:您可能想看看tinkerbell是如何解决同一问题的:这是一个在类中添加函数的简单示例(粘贴在下面以供参考,但链接中有更好的描述) 添加属性也差不多。我添加了一个跟踪(字段)循环,以帮助了解它们是如何定义的: Main.hx
@:build(TypeBuildingMacro.build("myFunc"))
class Main {
static public function main() {
trace(Main.myFunc); // my default
}
}
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;
}
}
TypeBuildingMacro.hx
@:build(TypeBuildingMacro.build("myFunc"))
class Main {
static public function main() {
trace(Main.myFunc); // my default
}
}
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;
}
}
导入haxe.macro.Context;
导入haxe.macro.Expr;
类TypeBuildingMacro{
宏静态公共函数生成(字段名:字符串):数组{
var fields=Context.getBuildFields();
对于(字段中的字段){trace(field);}
var newField={
名称:fieldName,
doc:null,
meta:[],
访问:[无状态,无公共],
种类:FVar(宏:字符串,宏“我的默认值”),
pos:Context.currentPos()
};
fields.push(newField);
返回字段;
}
}
请注意,Main.hx必须使用@:build
元数据调用宏,以便编译器知道在处理主类本身之前运行宏(添加函数)。这(粘贴在下面以供参考,但链接中有更好的描述)是一个很好的方法,向类添加函数的简单示例
添加属性也差不多。我添加了一个跟踪(字段)循环,以帮助了解它们是如何定义的:
Main.hx
@:build(TypeBuildingMacro.build("myFunc"))
class Main {
static public function main() {
trace(Main.myFunc); // my default
}
}
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;
}
}
TypeBuildingMacro.hx
@:build(TypeBuildingMacro.build("myFunc"))
class Main {
static public function main() {
trace(Main.myFunc); // my default
}
}
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;
}
}
导入haxe.macro.Context;
导入haxe.macro.Expr;
类TypeBuildingMacro{
宏静态公共函数生成(字段名:字符串):数组{
var fields=Context.getBuildFields();
对于(字段中的字段){trace(field);}
var newField={
名称:fieldName,
doc:null,
meta:[],
访问:[无状态,无公共],
种类:FVar(宏:字符串,宏“我的默认值”),
pos:Context.currentPos()
};
fields.push(newField);
返回字段;
}
}
请注意,Main.hx必须使用
@:build
元数据调用宏,这样编译器就知道在处理主类本身之前运行宏(它添加了函数)。嗨,Franco,我已经研究过了-唉,它非常混乱。我也看了一眼,但是它做了很多事情,它真的没有回答我的更基本的问题。例如,为什么所有tinkerbell类都实现“tink.lang.Cls”,或者宏系统对“@:xxx”有何反应?为什么会触发宏观系统?还有“@:prop”和类PropBuilder之间的关联是什么。我找不到任何信息给这个Hi Franco,我查了一下——唉,这太令人困惑了。我也看了一眼,但是它做了很多事情,它真的没有回答我的更基本的问题。例如,为什么所有tinkerbell类都实现“tink.lang.Cls”,或者宏系统对“@:xxx”有何反应?为什么会触发宏观系统?还有“@:prop”和类PropBuilder之间的关联是什么。我找不到这方面的任何信息