2

未来を返すミラーを持つことは、それらでできることを劇的に制限します。

例えば、

class ObjectA {
  methodA(){}
  methodB(){}
}

class DynamicWrapper extends MagicalDynamicWrapper {
  ObjectA real;
  Map<String, Function> methods;
  DynamicWrapper(this.real, this.methods);
}

var w = new DynamicWrapper(new ObjectA(), {"methodB" : (){ 'do something' }});
w.methodA() // calls ObjectA.methodA
w.methodB() // calls 'do something'

私が通常行う方法は、MagicalDynamicWrapper で noSuchMethod を定義することです。

  • メソッドマップにそのような名前のメソッドがあるかどうかを確認し、それを呼び出します。
  • 存在しない場合は、リフレクションを介して「実際の」オブジェクトを呼び出します。

残念ながら、実際のオブジェクトを呼び出すと、常に未来が返されます。だからうまくいかない。

ある時点で (値ゲッターを使用して) Future の値を取得することができましたが、そのゲッターは使用できなくなりました。

私の質問:

リフレクション呼び出しの結果を同期的に取得する方法はありますか?

分散設定では、先物は間違いなく進むべき道です。しかし、すべてのメタ情報が利用可能な非分散設定では、リフレクション呼び出しの値を取得できるはずです。テスト フレームワークとビルド ツールの作成者にとって、私は大きな違いをもたらすでしょう。

4

2 に答える 2

2

先物を返すミラーを持つことは確かに理にかなっています

いいえ、そうではありません(少なくとも私にはそうではありません:-))。おそらく変更されるでしょう。 http://dartbug.com/4633#c17を参照してください。

私が通常行う方法は、MagicalDynamicWrapper で noSuchMethod を定義することです。これは、メソッド マップにそのような名前のメソッドがあるかどうかを確認してから呼び出し、存在しない場合は、「実際の」オブジェクトを呼び出します。反射。

InvocationMirrorドキュメントを確認してください。メソッドを使用してメソッド呼び出しを転送できますinvokeOn

class Proxy {
  var target;
  Map<String, Function> overrides;

  Proxy(this.target, this.overrides);

  noSuchMethod(invocation) {
    if (overrides.containsKey(invocation.memberName)) {
      return overrides[invocation.memberName]();
    } else {
      return invocation.invokeOn(target);
    }
  }
}

リフレクション呼び出しの結果を同期的に取得する方法はありますか?

いいえ、そうではありません。今じゃない。今はだめなの。必要に応じて、 http://dartbug.com/4633にスターを付けることができます。

于 2013-02-23T16:07:29.250 に答える
1

当分の間、deprecatedFutureValue(aFuture) を使用できます。明らかに、彼らはその名前で使用を思いとどまらせており、最終的にはなくなりますが、同期ミラー API を取得するまでは、このようなものが絶対に必要であることに同意します。

于 2013-02-24T20:20:15.580 に答える