【问题标题】:Dart how to make a function that can accept any number of argsDart 如何制作一个可以接受任意数量 args 的函数
【发布时间】:2013-04-28 11:30:56
【问题描述】:

来自python,我知道我可以轻松做到这一点:

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

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

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

谢谢。

【问题讨论】:

标签: dart


【解决方案1】:

Dart 中没有真正的可变参数支持。有,但一直是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});
}

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      只要你不太注重语法简洁,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]);
      

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

      【讨论】:

      • Dart 的轻量级列表文字语法确实使缺少可变参数的痛苦减轻了,但认为在这里声明支持有点牵强 - 可变参数的全部意义在于语法糖支持可变数量的参数不必将它包装在一个集合中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      相关资源
      最近更新 更多