我想知道是否可以使用地图调用带有名称参数的函数,例如
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会不会更优雅? 更多,使用这个黑客,可选的kwargs可能会变得痛苦...... 恕我直言可能的实现,如果它还不存在,将是这样的:
slave(kwargs = a)
e.g。接受命名param的每个函数都可以默默地接受(Map)kwargs(或其他名称)参数,如果定义dart应该在引擎盖下处理这个逻辑:如果Map中的键完全是非可选的,加上{}括号中定义的一些可选项,以及兼容类型“继续”。
答案 0 :(得分:9)
您可以使用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;
}