在DART的参数或参数变量数创建功能(Creating function with variable

2019-06-21 15:59发布

我正在寻找一种方式来创建的飞镖变量或参数的变量数的函数。 我知道我可以创建一个数组参数,而不是,但我更愿意这样做,因为我工作的一个图书馆,语法简洁是非常重要的。

例如,在普通的JavaScript,我们可以做这样的事情(从借来这里 ):

function superHeroes() {
  for (var i = 0; i < arguments.length; i++) {
    console.log("There's no stopping " + arguments[i]);
  }
}

superHeroes('UberMan', 'Exceptional Woman', 'The Hunk');

然而,在镖,该代码将无法运行。 有没有办法做同样的事情在镖? 如果不是,就是这个东西是对的路线图?

Answer 1:

你不能做到这一点现在。

我真的不知道,如果可变参数会回来-他们一些时间前在那里,但已被删除 。

然而,它是可能的模拟可变参数 仿效功能 。 请参见下面的代码片段。

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');
}


Answer 2:

我打得四处一点与亚历山大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()使得它更可能你会忘记,如果你改变的方法名称改变“超级英雄”字符串。
  • 反射使得代码路径很难追查。

但如果你是细跟所有这些问题,那么这能够完成任务。



Answer 3:

如果你真的到语法简洁,只需要声明一个函数/法说,10个可选位置参数和完成。 这是不太可能有人会打电话告诉我们,超过10个参数。

如果这听起来像一个黑客,这是因为它一个黑客。 但我见过的镖队做同样的:-)



Answer 4:

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

我期待在dartbug.com,但我没有看到这个功能请求。 你肯定是欢迎建立一个!



文章来源: Creating function with variable number of arguments or parameters in Dart
标签: dart