簡體   English   中英

Haxe宏,從生成的var setter中調用靜態方法

[英]Haxe macros, calling static method from generated var setter

我正在使用haxe宏將getter和setters添加到變量中,現在我一直試圖從新生成的setter中調用靜態函數:

public static function build():Array<Field> {
//.........
// create setter
var setterBody = macro {
    $variableRef = v;
    // mypackage.MyClass.myFunc(this) <-------- DOES NOT WORK!!
    return $variableRef;
};
newFields.push({
    pos: Context.currentPos(),
    name: "set_" + field.name,
    meta: [],
    kind: FieldType.FFun({
            ret: readType,
            params: [],
            expr: setterBody,
            args: [{
                value: null,
                type: readType,
                opt: false,
                name: "v"
            }]
        }),
    doc: "",
    access: []
});

在上面的代碼中,我找不到調用MyClass.myFun(this) ,我不知道如何為設置器生成代碼, this是指調用設置器的對象實例。

非常感謝你。

沒有更完整的示例,很難知道出了什么問題。 我能做的就是向您展示有效的代碼:

TiagoLrMacroTest.hx

@:build( TiagoLrMacro.build() )
class TiagoLrMacroTest {
    public static function main() {
        var test = new TiagoLrMacroTest();
        test.name = "hello";
    }

    function new() {}

    public var name(default,set):String;
}

class MyStaticClass {
        public static function staticMethod( a:TiagoLrMacroTest ) {
        trace( a.name );
    }
}

TiagoLrMacro.hx

import haxe.macro.Expr;
import haxe.macro.Context;

class TiagoLrMacro {
    public static function build():Array<Field> {
        var fields = Context.getBuildFields();
        var setterBody = macro {
            name = v;
            TiagoLrMacroTest.MyStaticClass.staticMethod( this );
            return name;
        };
        fields.push({
            pos: Context.currentPos(),
            name: "set_name",
            meta: [],
            kind: FieldType.FFun({
                ret: macro :String,
                params: [],
                expr: setterBody,
                args: [{
                    value: null,
                    type: macro :String,
                    opt: false,
                    name: "v"
                }]
            }),
            doc: "",
            access: []
        });
        return fields;
    }
}

結果 (Haxe 3.1.3):

TiagoLrMacroTest.hx:15: hello

我在宏中調用靜態方法時遇到的一個常見陷阱是不遵守導入,因此您必須使用mypackage.MyClass.myFunc(this)類的完整類型路徑,但是您已經在執行此操作,因此錯誤必定是您代碼中的其他地方。 快樂宏ing :)

暫無
暫無

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

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