如何確定一個函數在Haxe中的參數個數?如何確定函數在Haxe中的參數數目?
我看過Reflect和Type API沒有成功。在AS3和JavaScript,你可以做Function#length
。對於大多數(如果不是全部)其他Haxe目標,也可以使用類似的反射能力。結合Haxe的詳細類型系統,必須有一種方法來確定我忽略的函數的參數個數。
如何確定一個函數在Haxe中的參數個數?如何確定函數在Haxe中的參數數目?
我看過Reflect和Type API沒有成功。在AS3和JavaScript,你可以做Function#length
。對於大多數(如果不是全部)其他Haxe目標,也可以使用類似的反射能力。結合Haxe的詳細類型系統,必須有一種方法來確定我忽略的函數的參數個數。
我最終走了宏觀路線,這是我想出的。
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;
}
}
}
如果這些函數是可以獲取運行時類型信息的類的成員,則可以將@: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 {
}
}
最好的解決方案取決於您的使用情況。在編譯時也可以編寫一個宏來獲取參數的個數。
如果你的目標是as3或js,你可以去無類型的,仍然可以訪問長度。 –