簡體   English   中英

如何為屬性擴展創建宏

[英]How do I create a macro for property extensions

我想編寫自己的宏以在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;
    }
 }

我閱讀了相應的文檔,但老實說,我覺得它們很混亂。

謝謝

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

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類本身之前就知道要運行該宏(添加了函數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM