Dart - 使用Map命名参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart - 使用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
}

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

slave(kwargs = a)

例如接受命名param的每个函数都可以默默地接受(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){
  final result = new Map<Symbol, dynamic>();
  map.forEach((String k,v) { result[new Symbol(k)] = v; });
  return result;
}

以上是关于Dart - 使用Map命名参数的主要内容,如果未能解决你的问题,请参考以下文章

Dart:Dart 如何匹配类的构造函数中的命名参数?

Dart 中使用 ifAbsent 的 Map Update 方法

在 Dart 中定义函数时,如何将参数的默认值设置为 ,即空 Map?

参数类型 'Book' 不能分配给参数类型 'Map<String, dynamic>'.dart(argument_type_not_assignable)

第三节: Dart 中常用集合 List/Map

Dart语法之可选参数