【问题标题】:Haxe macros, calling static method from generated var setterHaxe 宏,从生成的 var setter 调用静态方法
【发布时间】:2015-03-03 20:54:46
【问题描述】:

我正在使用 haxe 宏将 getter 和 setter 添加到变量中,现在我试图从新生成的 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)的方法,我不知道如何为setter生成该代码,this指的是调用setter的对象的实例。

非常感谢。

【问题讨论】:

    标签: macros haxe


    【解决方案1】:

    如果没有更完整的示例,很难知道出了什么问题。我能做的就是向您展示有效的代码:

    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) 这样的完整类型路径,但您已经这样做了,所以错误一定在其他地方在你的代码中。快乐的宏 :)

    【讨论】:

    • 它有效,有趣的是我仍然无法弄清楚我做错了什么,没有意义,重要的是它有效,谢谢。
    • 总是令人沮丧!希望您能缩小范围并找出答案或获取可重复的样本,以便我们提供帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2016-05-13
    • 2014-07-28
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多