我正在寻找一种在Haxe做这样的事情的方法:
function foo(...args)
{
for (arg in args)
{
...
}
}
周围有人可以帮助我吗?
答案 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));