Parameters Haxe中参数的可变数量

Parameters Haxe中参数的可变数量,parameters,haxe,Parameters,Haxe,我正在寻找一种在Haxe中执行类似操作的方法: function foo(...args) { for (arg in args) { ... } } 这里有人能帮我吗?Haxe没有rest参数,主要是因为这些参数本质上是非类型化的,而且语言应该有助于输入最安全的代码。类型化代码可以由编译器检查和优化。编译时错误越多,运行时错误越少 仍然可以通过几种方式实现rest参数的相同结果,这取决于您正在寻找的内容;该函数是否仅接收值或对象 最直接的方法是使用Any类型和Re

我正在寻找一种在Haxe中执行类似操作的方法:

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

这里有人能帮我吗?

Haxe没有rest参数,主要是因为这些参数本质上是非类型化的,而且语言应该有助于输入最安全的代码。类型化代码可以由编译器检查和优化。编译时错误越多,运行时错误越少

仍然可以通过几种方式实现rest参数的相同结果,这取决于您正在寻找的内容;该函数是否仅接收值或对象

最直接的方法是使用
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]);
静态函数循环(值:数组

还有,如果您熟悉宏,这会很好。请注意,这将在编译时进行跟踪,目前不会在输出源中生成跟踪

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);
导入haxe.macro.Expr;
宏静态函数循环(e1:Expr,props:Array)
{
对于(道具中的e)
{
微量元素(e);
}
返回宏null;
}
//用法:
循环(“foo”、a、b、c);

当然,最好的建议是不要为了保持类型安全而采取动态措施,但是这会让你继续下去。

如果你真的需要,有一个方法:这是非常没有类型的,所以我建议你先考虑使用一个类型化的替代品。 就我个人而言,我可能只在调试时使用它,或者在由于其他原因已经没有类型化的代码中使用它

例如:

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));
静态函数\u foo(args:Array)
{
return“调用时使用:”+args.join(“,”);
}
静态变量foo:Dynamic=Reflect.makeVarArgs(\u foo);
[...]
微量元素(foo(1));
微量元素(foo(1,2));
微量元素(foo(1,3,3));

()

您不能传入数组或对象?按照您指定的方式,键入安全性和内容将丢失。是的!我认为这是最接近、最简单的方法。这能回答您的问题吗?谢谢您的回答!数组解决方案对我有帮助。我正在实现键盘输入管理器,我需要执行类似:
keyboard.bi的操作nd(“jump”,Key.UP,Key.W);
只是为了更好地阅读。但是写:
键盘.bind(“jump”,Key.UP,Key.W]);
是最接近的方法。在这种情况下,我当然会使用数组。数组已经有了API和工具可以使用它们。@JersonLaTorre我可能会使用宏来实现这一点。使用宏方法,如何将rest参数限制为单一类型,即
Int
s?如果expr不可用,如何因编译错误而失败您期望的类型?对于其余参数遵循相同类型的情况,
\u foo
只接受
Int
数组的情况,使用
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));