1

我想编写自己的宏来在 Haxe 中创建类似对象的属性。这个问题与其说是关于属性,不如说是关于编写宏。(可能 NME 已经有一个宏)。

在haxe上这门课

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;
    }
 }

我阅读了相应的文档,但老实说,我发现它们非常令人困惑。

谢谢

4

2 回答 2

1

您可能想看看 tinkerbell 如何解决相同的问题:https ://github.com/back2dos/tinkerbell/wiki/tink_lang#wiki-accessors

于 2013-01-02T21:36:09.043 回答
0

在Haxe 手册中找到的这个类型生成器示例(粘贴在下面以供参考,但在链接中有更好的描述)是一个很好的、简单的向类添加函数的示例。

添加属性将大致相同。我添加了一个 trace(field) 循环来帮助了解它们是如何定义的:

主文件.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 类本身之前运行宏(添加函数)。

于 2016-03-17T17:38:59.790 回答