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);
当然最好的建议是不要太动态以保持类型安全,但这应该会让你继续前进。