Haxe中可变数量的参数

时间:2017-04-18 06:36:02

标签: parameters haxe

我正在寻找一种在Haxe做这样的事情的方法:

function foo(...args)  
{  
  for (arg in args)
  {
    ...
  }
}

周围有人可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

Haxe没有休息参数,主要是因为它们本质上是无类型的,并且语言应该有助于输入以获得最安全的代码。编译器可以检查并优化类型代码。编译时错误更多,运行时错误更少。

休息参数的结果仍然可以通过几种方式以某种方式实现,具体取决于您所寻找的内容;函数只接收值还是对象?

最直接的方法是使用Any类型和Reflect

function loop(props:Any) 
{
    for (prop in Reflect.fields(props))
    {
        trace(prop, Reflect.field(props, prop));
    }
}
// usage: 
loop({name: "Jerson", age: 31});

您可以只使用带数值的数组,因此在使用数组时也需要使用数组:

static function loop(values:Array<Any>) 
{
    for (i in 0...values.length)
    {
         trace(i, values[i]);
    }
}
//usage:
loop(["Jerson", 31]);

如果你在实现中不喜欢这个数组,你也可以使用这个不值得的函数,我不建议这样做,只是为了给出一个想法。

function loop<A,B,C,D,E,F>(?prop1:A, ?prop2:B, ?prop3:C, ?prop4:D, ?prop5:E, ?prop6:F) 
{
    var props:Array<Any> = [prop1,prop2,prop3,prop4,prop5,prop6];
    for (i in 0...props.length)
    {
         trace(i, props[i]);
    }
}
// usage: 
 loop3("Jerson", 31);

请在此处尝试以下示例:https://try.haxe.org/#Be3b7

还有macros for rest arguments,如果您熟悉宏,这可能会很好。请注意,这将在编译时进行跟踪,并且此时不会在输出源中生成跟踪。

import haxe.macro.Expr;

macro static function loop(e1:Expr, props:Array<Expr>)
{
    for (e in props) 
    {
        trace(e);
    }
    return macro null;
}
// Usage:
loop("foo", a, b, c);

当然,最好的建议是不要动态地保持类型安全,但这应该让你继续前进。

答案 1 :(得分:2)

如果你真的需要,有办法:Reflect.makeVarArgs。这是非常类型的,所以我建议你先考虑使用一个打字的替代品。

就我个人而言,我可能只会将其用于调试或者由于其他原因而已经无法输入的代码。

示例:

static function _foo(args:Array<Dynamic>)
{
    return "Called with: " + args.join(", ");
}

static var foo:Dynamic = Reflect.makeVarArgs(_foo);

[...]

trace(foo(1));
trace(foo(1, 2));
trace(foo(1, 3, 3));

see it in Try Haxe