如何确定函数在 Haxe 中接受的参数数量?
How do I determine the number of arguments a function takes in Haxe?
如何确定函数在 Haxe 中接受的参数数量?
我看过Reflect and Type APIs without success. In AS3 and JavaScript,你可以Function#length
。大多数(如果不是全部)其他 Haxe 目标都具有类似的反射能力。结合 Haxe 的详细类型系统,一定有一种方法可以确定我忽略的函数的参数数量。
如果这些函数是您可以获得 运行 时间类型信息的 class 的成员,那么您可以将 @:rtti
注释添加到 class 并且在 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 {
}
}
不过,最佳解决方案取决于您的用例。也可以编写一个宏来在编译时只获取参数的数量。
我最终选择了宏观路线,这就是我的想法。
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 中接受的参数数量?
我看过Reflect and Type APIs without success. In AS3 and JavaScript,你可以Function#length
。大多数(如果不是全部)其他 Haxe 目标都具有类似的反射能力。结合 Haxe 的详细类型系统,一定有一种方法可以确定我忽略的函数的参数数量。
如果这些函数是您可以获得 运行 时间类型信息的 class 的成员,那么您可以将 @:rtti
注释添加到 class 并且在 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 {
}
}
不过,最佳解决方案取决于您的用例。也可以编写一个宏来在编译时只获取参数的数量。
我最终选择了宏观路线,这就是我的想法。
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;
}
}
}