【问题标题】:Dart - named parameters using a MapDart - 使用 Map 的命名参数
【发布时间】:2013-05-22 09:20:14
【问题描述】:

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

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 中的键完全是非可选的,加上一些可选的,在 {} 括号中定义,并且兼容类型“继续”。

【问题讨论】:

    标签: dart


    【解决方案1】:

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

    【讨论】:

    • 好的,我正在搜索的内容 :)
    • 值得注意的是,调用“new Symbol()”会使 dart2js 更难压缩你的代码。这可能会导致您的 js 输出变得臃肿。您最好更改 slave() 以将 Map 作为参数。
    • 如何在构造函数中使用这个?
    • 由于某些值可能是其他“对象”,我想知道我们是否可以使用反射来递归推断命名参数的类型。
    猜你喜欢
    • 2020-05-20
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2020-07-04
    • 2019-10-31
    相关资源
    最近更新 更多