Function 如何确定函数在Haxe中接受的参数数?

Function 如何确定函数在Haxe中接受的参数数?,function,reflection,haxe,Function,Reflection,Haxe,如何确定函数在Haxe中接受的参数数 我已经看过了和API,但没有成功。在和中,您可以执行函数#length。类似的反射能力适用于大多数(如果不是全部的话)其他Haxe目标。结合Haxe的详细类型系统,必须有一种方法来确定我忽略的函数的参数数量。如果这些函数是可以获取运行时类型信息的类的成员,那么可以向类添加@:rtti注释,并在rtti结构中查找这些字段。见: 尤其是cf函数获取一个参数列表,其长度将是您想要的,并且将在RTTI中。比如: @:rtti class Main { pub

如何确定函数在Haxe中接受的参数数


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

如果这些函数是可以获取运行时类型信息的类的成员,那么可以向类添加
@:rtti
注释,并在rtti结构中查找这些字段。见:

尤其是
cf函数
获取一个参数列表,其长度将是您想要的,并且将在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 {
    }
}

不过,最佳解决方案取决于您的用例。也可以编写一个宏,在编译时只获取参数的数量。

我最终选择了宏路线,下面是我的想法

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;
        }
    }
}
导入haxe.macro.Context;
导入haxe.macro.Type;
导入haxe.macro.Expr;
班长{
静态函数main(){
函数test1(a,b,c){}
函数test2(){}
跟踪(numberOfArgs(test1));//3
跟踪(numberOfArgs(test2));//0
trace(numberOfArgs(函数test3(a,b){}));//2
跟踪(numberOfArgs('test');//null
}
宏静态函数numberOfArgs(f:Expr):ExprOf{
var fType:Type=Context.typeof(f);
if(Reflect.hasField(fType,'args')){
var-fArgs:Array=Reflect.field(fType,'args');
返回宏$v{fArgs[0].length};
}否则{
返回宏null;
}
}
}

如果您以as3或js为目标,您可以取消键入,仍然可以访问长度。