来自python
,我知道我可以很容易地做到这一点:
def someFunc(*args):
for i in args:
print i
这样我可以轻松地给出100个args。
如何在Dart上做类似的事情?
THX。
答案 0 :(得分:10)
Dart没有真正的vararg支持。有,但它一直是removed。正如Fox32所说,您可以使用noSuchMethod
执行此操作。但是,如果没有真正需要调用像method(param1, param2, param3)
这样的方法,您可以跳过此步骤并定义Map
或List
作为参数。 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
实例作为参数,包含方法名称和所有未命名参数作为列表,所有命名参数作为哈希映射。
有关noSuchMethod
和call()
的详细信息,请参阅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]);
注意:您可以使用命名参数执行相同的操作,但必须在内部进行处理,以防万一(该功能的用户;可能是您)决定不会将任何值传递给该命名参数。