如何确定函数在Haxe中的参数个数?

时间:2015-08-08 07:33:53

标签: function reflection haxe

如何确定函数在Haxe中的参数个数?

我查看了ReflectType API但没有成功。在AS3JavaScript中,您可以执行Function#length。对于大多数(如果不是全部)其他Haxe目标,也可以使用类似的反射能力。结合Haxe的详细类型系统,必须有一种方法来确定我忽略的函数的数量。

2 个答案:

答案 0 :(得分:4)

我最终走上了宏观路线,而这就是我想出的。

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

class Main {
    static function main() {
        function test1(a, b, c) {}
        function test2() {}
        trace(numberOfArgs(test1));  // 3
        trace(numberOfArgs(test2));  // 0
        trace(numberOfArgs(function test3(a, b) {}));  // 2
        trace(numberOfArgs('test')); // null
    }

    macro static function numberOfArgs(f:Expr):ExprOf<Null<Int>> {
        var fType:Type = Context.typeof(f);
        if (Reflect.hasField(fType, 'args')) {
            var fArgs:Array<Dynamic> = Reflect.field(fType, 'args');
            return macro $v{fArgs[0].length};
        } else {
            return macro null;
        }
    }
}

答案 1 :(得分:2)

如果这些函数是可以获取运行时类型信息的类的成员,那么您可以将@:rtti注释添加到类中,并在RTTI结构中查找这些字段。请参阅:http://haxe.org/manual/cr-rtti-structure.html

特别是CFunction获取一个参数列表,其长度将是您想要的,并且将在RTTI中。类似的东西:

@:rtti
class Main {
    public static function main():Void {
        var rtti = haxe.rtti.Rtti.getRtti(Main);
        trace(rtti); // Search in rtti->fields for foo
    }

    public function foo(a:Int, b:Int, c:Float, d:String):Void {
    }
}

最好的解决方案取决于您的用例。也可以编写宏来在编译时获得参数的数量。