在Dart中创建具有可变数量的参数或参数的函数

问题描述 投票:25回答:4

我正在寻找一种在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中,该代码将无法运行。有没有办法在飞镖中做同样的事情?如果没有,这是路线图上的内容吗?

dart
4个回答
20
投票

你现在不能这样做。

我真的不知道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');
}

5
投票

我在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()中的成员名称,如果更改方法名称,则更有可能忘记更改“超级英雄”字符串。
  • 反射使代码路径更难追踪。

但如果你对所有这些问题都很好,那么这就完成了工作。


3
投票

如果您真的想要语法简洁,只需声明一个函数/方法,并说明10个可选的位置参数即可完成。不太可能有人会用超过10个参数来调用它。

如果它听起来像一个黑客,那是因为它是一个黑客。但是我看到Dart团队做了同样的事情:-)


2
投票

对于你写的例子,我认为你最好使用一个列表。对于那个很抱歉!

我正在看dartbug.com,但我没有看到这方面的功能请求。你绝对欢迎创造一个!

© www.soinside.com 2019 - 2024. All rights reserved.