2015-08-08 32 views
2

如何確定一個函數在Haxe中的參數個數?如何確定函數在Haxe中的參數數目?

我看過ReflectType API沒有成功。在AS3JavaScript,你可以做Function#length。對於大多數(如果不是全部)其他Haxe目標,也可以使用類似的反射能力。結合Haxe的詳細類型系統,必須有一種方法來確定我忽略的函數的參數個數。

+0

如果你的目標是as3或js,你可以去無類型的,仍然可以訪問長度。 –

回答

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; 
     } 
    } 
} 
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 { 
    } 
} 

最好的解決方案取決於您的使用情況。在編譯時也可以編寫一個宏來獲取參數的個數。

相關問題