9

来自python,我知道我可以很容易地做到这一点:

def someFunc(*args):
    for i in args:
        print i

这样我就可以轻松地给出 100 个参数。

如何在 Dart 上做类似的事情?

谢谢。

4

3 回答 3

16

Dart 中没有真正的可变参数支持。有,但已被删除。正如 Fox32 所说,您可以使用noSuchMethod. 但是,如果没有真正需要调用类似的方法method(param1, param2, param3),您可以跳过这一步并定义一个MapList作为参数。Dart 支持这两种类型的字面量,因此语法也简洁明了:

void method1(List params) {
  params.forEach((value) => print(value));
}

void method2(Map params) {
  params.forEach((key, value) => print("$key -- $value"));
}

void main() {
  method1(["hello", "world", 123]);
  method2({"name":"John","someNumber":4711});
}
于 2013-04-28T19:21:18.923 回答
3

您可以noSuchMethod在类上使用该方法(可能与该call()方法结合使用,但我没有尝试过)。但是在使用它时,您似乎失去了飞镖编辑器的一些检查功能(至少对我而言)。

该方法有一个Invocation实例作为参数,其中包含方法名称和所有未命名参数作为列表以及所有命名参数作为哈希图。

有关 和的更多详细信息,请参见此处。但该链接包含不适用于里程碑 4 的过时信息,请参阅此处了解更改。noSuchMethodcall()

像这样的东西:

typedef dynamic FunctionWithArguments(List<dynamic> positionalArguments, Map<Symbol, dynamic> namedArguments);

class MyFunction
{
  final FunctionWithArguments function;

  MyFunction(this.function);

  dynamic noSuchMethod(Invocation invocation) {
    if(invocation.isMethod && invocation.memberName == const Symbol('call')) {
      return function(invocation.positionalArguments, invocation.namedArguments);
    }

    return;
  }
}

用法:

class AClass {
  final aMethod = new MyFunction((p, n) {
    for(var a in p) {
      print(a);
    }
  });
}


var b = new AClass();

b.aMethod(12, 324, 324);
于 2013-04-28T13:02:53.950 回答
0

Dart 确实间接支持 var-args,只要您不太注重语法简洁性。

void testFunction([List<dynamic> args=[]])
{
  for(dynamic arg:args)
  {
    // Handle each arg...
  }
}

testFunction([0, 1, 2, 3, 4, 5, 6]);
testFunction();
testFunction([0, 1, 2]);

注意:您可以使用命名参数做同样的事情,但您必须在内部处理事情,以防万一用户(该函数的用户;可能是您)决定不向该命名参数传递任何值。

于 2020-05-26T18:27:43.443 回答