16

マップを使用して名前パラメーターを持つ関数を呼び出すことができるかどうかを知りたいです。

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 として受け入れるだけのほうがエレガントではないでしょうか? さらに、このハックを使用すると、オプションの kwargs はおそらく苦痛になるでしょう...まだ存在しない場合、可能な実装は次のようになります。

slave(kwargs = a)

たとえば、名前付きパラメーターを受け入れるすべての関数は、(マップ) kwargs (または他の名前) 引数を黙って受け入れることができます。定義された dart がフードの下でこのロジックを処理する必要がある場合: マップのキーがオプションではないものである場合に加えて、{} ブラケットで定義され、互換性のあるタイプのオプションのいくつかが「続行」されます。

4

1 に答える 1

19

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));
}
于 2013-05-22T11:12:31.757 に答える