macros - 如何使用 Haxe 宏构建摘要?

标签 macros haxe

我找不到任何使用宏创建摘要的示例代码或教程。

//Class code ReflectionClassInfo.hx
@:build(ReflectionClassInfoMacro.build())
abstract ReflectionClassInfo({}) from ({}) to ({}) {}

//Driver code
var r=new ReflectionClassInfo();
//Immeditately makes the compiler complain about there is no constructor

如何修复编译器错误?

最佳答案

需要认识到的重要一点是,类和抽象的构建宏之间实际上没有任何区别。在这两种情况下,它们都会构建字段,这意味着它们必须返回 haxe.macro.Expr.Field 的数组。 。因此,适用于其中一个的任何文档或代码示例也适用于另一个。

修复示例中编译器错误的最简单/最易读的方法是使用 class reification ,以便可以使用常规 Haxe 语法声明构造函数:

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

class Macro {
    public static function build():Array<Field> {
        var fields = Context.getBuildFields();
        fields = fields.concat((macro class {
            public function new() {
                this = {};
            }
        }).fields);
        return fields;
    }
}
class Main {
    static function main() {
        new Abstract(); // compiles
    }
}

@:build(Macro.build())
abstract Abstract({}) from {} to {} {}

关于macros - 如何使用 Haxe 宏构建摘要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60379484/

相关文章:

C++ - enum vs. const vs. #define

javascript - 如何使用haxe创建可重用的js库?

c# - Haxe - 将 haxe 代码编译为 .NET DLL 而不是 EXE

haxe - Haxe 中有某种退出语句吗?

macros - 尝试!不会编译不匹配的类型

macros - 在 Rust 宏 2.0 中使用内部规则

scala - 在运行时访问源代码文本的宏

assembly - 如何扩展 TASM 宏

flash - Haxe http 请求违反安全沙箱

sockets - Haxe:连接到远程主机