1

Haxe でオブジェクトのようなプロパティを作成するための独自のマクロを書きたいと思います。この質問はプロパティに関するものではなく、マクロの記述に関するものです。(おそらく、NME にはそのためのマクロが既にあります)。

このクラスをhaxに持つ

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

ティンカーベルが同じ問題をどのように解決するかを確認することをお勧めします:https ://github.com/back2dos/tinkerbell/wiki/tink_lang#wiki-accessors

于 2013-01-02T21:36:09.043 に答える
0

Haxe マニュアルにあるこのType Builder の例(参照用に以下に貼り付けていますが、リンクに詳しい説明があります) は、クラスに関数を追加する優れた単純な例です。

プロパティの追加もほぼ同じです。それらがどのように定義されているかを理解するのに役立つように、trace(field) ループを追加しました。

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 クラス自体を処理する前に (関数を追加する) マクロを実行する必要があることに注意してください。

于 2016-03-17T17:38:59.790 に答える