【问题标题】:How do I determine the number of arguments a function takes in Haxe?如何确定函数在 Haxe 中接受的参数数量?
【发布时间】:2015-08-08 07:33:53
【问题描述】:

如何确定一个函数在 Haxe 中接受的参数数量?

我查看了ReflectType API,但没有成功。在AS3JavaScript,你可以做Function#length。大多数(如果不是全部)其他 Haxe 目标都可以使用类似的反射能力。结合 Haxe 的详细类型系统,一定有办法确定我忽略的函数的参数个数。

【问题讨论】:

  • 如果你以 as3 或 js 为目标,你可以去无类型,仍然可以访问长度。

标签: function reflection haxe


【解决方案1】:

我最终选择了宏观路线,这就是我想出的。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多