我正在寻找一种在Dart中创建具有可变数量的参数或参数的函数的方法。我知道我可以创建一个数组参数,但我宁愿不这样做,因为我正在研究一个语法简洁很重要的库。
例如,在纯JavaScript中,我们可以做这样的事情(借用here):
function superHeroes() {
for (var i = 0; i < arguments.length; i++) {
console.log("There's no stopping " + arguments[i]);
}
}
superHeroes('UberMan', 'Exceptional Woman', 'The Hunk');
但是,在dart中,该代码将无法运行。有没有办法在飞镖中做同样的事情?如果没有,这是路线图上的内容吗?
你现在不能这样做。
我真的不知道varargs是否会回来 - 他们曾经在那里,但have been removed。
然而,有可能用Emulating functions模仿varargs。请参阅以下代码段。
typedef dynamic OnCall(List);
class VarargsFunction extends Function {
OnCall _onCall;
VarargsFunction(this._onCall);
call() => _onCall([]);
noSuchMethod(Invocation invocation) {
final arguments = invocation.positionalArguments;
return _onCall(arguments);
}
}
main() {
final superHeroes = new VarargsFunction((arguments) {
for (final superHero in arguments) {
print("There's no stopping ${superHero}");
}
});
superHeroes('UberMan', 'Exceptional Woman', 'The Hunk');
}
我在Alexandre Ardhuin的回答中玩了一下,发现我们可以调整一些东西,使其在当前版本的Dart中工作:
class VarArgsClass {
noSuchMethod(InvocationMirror invocation) {
if (invocation.memberName == 'superheroes') {
this.superheroes(invocation.positionalArguments);
}
}
void superheroes(List<String> heroNames) {
for (final superHero in heroNames) {
print("There's no stopping ${superHero}!");
}
}
}
main() {
new VarArgsClass().superheroes('UberMan', 'Exceptional Woman', 'The Hunk');
}
这有很多问题,包括:
superheroes()
都会生成警告,因为签名与您的参数不匹配。List<String>
。noSuchMethod()
中的成员名称,如果更改方法名称,则更有可能忘记更改“超级英雄”字符串。但如果你对所有这些问题都很好,那么这就完成了工作。
如果您真的想要语法简洁,只需声明一个函数/方法,并说明10个可选的位置参数即可完成。不太可能有人会用超过10个参数来调用它。
如果它听起来像一个黑客,那是因为它是一个黑客。但是我看到Dart团队做了同样的事情:-)
对于你写的例子,我认为你最好使用一个列表。对于那个很抱歉!
我正在看dartbug.com,但我没有看到这方面的功能请求。你绝对欢迎创造一个!