簡體   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