16

我想知道我是否可以使用映射调用带有名称参数的函数,例如

void main()
{
  Map a = {'m':'done'}; // Map with EXACTLY the same keys as slave named param.
  slave(a);
}
void slave({String m:'not done'}) //Here I should have some type control
{ 
  print(m); //should print done
}

这里的技巧是不使用 kwargs 而是使用 Map,或者,如果您关心类型,则使用一些接口类(就像 Json-obj 一样),但是让它接受 map 作为 kwars 不是更优雅吗?更多,使用这个 hack,可选的 kwargs 可能会变得很痛苦......恕我直言,一个可能的实现,如果它还不存在的话,会是这样的:

slave(kwargs = a)

例如,每个接受命名参数的函数都可以静默接受 (Map) kwargs (或其他名称) 参数,如果定义了 dart 应该在幕后处理这个逻辑:如果 Map 中的键完全是非可选的,加上一些可选的,在 {} 括号中定义,并且兼容类型“继续”。

4

1 回答 1

19

您可以使用Function.apply做类似的事情:

main() {
  final a = new Map<Symbol, dynamic>();
  a[const Symbol('m')] = 'done';
  Function.apply(slave, [], a);
}

您还可以提取一个辅助方法来简化代码:

main() {
  final a = symbolizeKeys({'m':'done'});
  Function.apply(slave, [], a);
}

Map<Symbol, dynamic> symbolizeKeys(Map<String, dynamic> map){
  return map.map((k, v) => MapEntry(Symbol(k), v));
}
于 2013-05-22T11:12:31.757 回答