繁体   English   中英

Dart - 使用 Map 命名参数

[英]Dart - named parameters using a Map

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

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
}

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

slave(kwargs = a)

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

您可以使用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));
}

@alexandre-ardhuin 的答案是正确的,但缺少一些东西:How to call a constructor as Function。 您必须在类名之后使用属性new 这是一个例子:

main() {
  final a =  new Map<Symbol, dynamic>();
  Function.apply(MyClass.new, [], a);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM