0

そうでない場合、このようなものは地平線上にありますか?

これは、JavaScript、Ruby、Perlの機能の1つであり、これなしでは生きていけません。ハッシュメンバーで偽造できることは知っていますが、パーサーから(任意の)「ファーストクラス」メンバーを作成できるようにしたいと思います。

4

2 に答える 2

2

現在、まだ存在しないフィールドを設定できるものはありません。ミラー APIは、既存のフィールドを設定するために使用でき、最終的には新しいフィールドを動的に定義できるように拡張される可能性があります。

于 2012-10-18T21:20:28.970 に答える
1

クラスで「noSuchMethod」メソッドを使用してセッター/ゲッターをインターセプトし、受け取った値をマップに格納することもできます。

例(構文を正確に思い出せません...):

class Foo {
  var _dynamicProperties = new Map<String,Object>();

  noSuchMethod(String function_name, List args) {
    if (args.length == 0 && function_name.startsWith("get:")) {
      // Synthetic getter
      var property = function_name.replaceFirst("get:", "");
      if (_dynamicProperties.containsKey(property)) {
        return _dynamicProperties[property];
      }
    }
    else if (args.length == 1 && function_name.startsWith("set:")) {
      // Synthetic setter
      var property = function_name.replaceFirst("set:", "");
      // If the property doesn't exist, it will only be added
      _dynamicProperties[property] = args[0];
      return _dynamicProperties[property];
    }

    super.noSuchMethod(function_name, args)
  }
}

そして、これを次のようにコードで使用できます。

var foo = new Foo();
foo.bar = "Hello, World!";
print(foo.bar);

もちろん、これは型チェッカーによってチェックされないタイプミスにつながる可能性があります。

foo.bar = "Hello";
foo.baz = "Hello, World!"; // Typo, meant to update foo.bar.

ファクトリ コンストラクターのリダイレクトと暗黙のインターフェイスを使用して、型チェッカーの検証を行う方法はいくつかありますが、複雑になり始めます。

補足: これは、JsonObjectが JSON マップをクラス型構文に変換するために使用するものです。

于 2012-10-19T09:55:18.017 に答える