Dart如何制作一个可以接受任意数量args的函数

时间:2013-04-28 11:30:57

标签: dart

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

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

这样我可以轻松地给出100个args。

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

THX。

3 个答案:

答案 0 :(得分:10)

Dart没有真正的vararg支持。有,但它一直是removed。正如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});
}

答案 1 :(得分:2)

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

该方法有一个Invocation实例作为参数,包含方法名称和所有未命名参数作为列表,所有命名参数作为哈希映射。

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

这样的事情:

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

答案 2 :(得分: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]);

注意:您可以使用命名参数执行相同的操作,但必须在内部进行处理,以防万一(该功能的用户;可能是您)决定不会将任何值传递给该命名参数。