2017-04-18 35 views
2
参数变量数

我正在寻找一种方式做这样的事情在HAXE:在HAXE

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

有人在这里谁可以帮我?

+0

不能在一个数组传递或对象?按照您指定的方式,输入安全性和东西将会丢失。 – 5Mixer

+0

是啊!我认为这是最接近和最简单的方法。 –

回答

3

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

谢谢你的回答!阵列解决方案可以帮助我。我正在实现一个键盘输入管理器,我需要执行如下操作: 'Keyboard.bind(“jump”,Key.UP,Key.W);' 只是为了更好的阅读。但写作: 'Keyboard.bind(“jump”,[Key.UP,Key.W]);' 是最接近它的方式。 –

+0

我肯定会在这种情况下使用一个数组。数组已经有一个API和工具来处理它们。 – 5Mixer

+0

@JersonLaTorre我可能会使用这个宏。 –

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

+0

对于其余参数遵循相同类型的情况,'makeVarArgs'的通用版本会很好。即,如果'_foo'只接受一个'Int'数组。 – FullOfCaffeine