5

私はサイの初心者です。

現在、.NET4およびIKVM.NETを介してRhino1.7Rフレームワークを使用しています。setWrapFractory()APIを使用してNativeJavaObjectを実装するいくつかのラップされたクラスを公開しました。

public class InterceptNativeObject : NativeJavaObject
{
    public InterceptNativeObject()
    {

    }

    public override Object get(String name, Scriptable start)
    {
        Object res = base.get(name, start);
        if (res is NativeJavaMethod)
        {
            NativeJavaMethod method = (NativeJavaMethod)res;
            return new RhinoMethodWrapFunction(method);
        }
        if (res == org.mozilla.javascript.UniqueTag.NOT_FOUND &&
            base.javaObject is IPropertBox && base.javaObject != null)
        {
            object ret = ((IPropertBox)base.javaObject)._x__GetPropertyValue(name);

            return Utils.ConvertCLRValueToJavaValue(ret);
        }
        return res;
     }

     .....
}

これで、必要に応じてすべての.NETメソッドとプロパティにアクセスできます。

私の現在の問題は、NativeJavaObjectクラスの「for...in」をサポートすることです。私が評価するとき

     'for(var prop in myClass){printf(prop);};' ,

'非オブジェクトの呼び出し'エラーで'no'を返します。

'get'が' _iterator _ 'のオブジェクトを検索しようとしているようですが、get()関数で'notfound'になりましたしたがって、例外が発生します。これまでに試しました

  • java.util.iteratorを追加しました
  • this.getIds()。GetEnumrator();を返します。

作品はありません。

ラップされたNativeJavaObjectのプロパティ列挙アクセスを許可するにはどうすればよいですか?'for ... in 'を有効にするためのRhinoの期待収益値' _iterator _ 'は何ですか?

前もって感謝します!

4

1 に答える 1

2

__iterator__Mozilla 固有の言語拡張の一部です。そのリンクは、メソッドがイテレータが使い果たされたときにスロー__iterator__するメソッドを持つオブジェクトを返すことを説明しています。nextStopIteration

ただし、イテレータとジェネレータにオプトインする必要があります。

Context.setLanguageVersion()JavaScript 1.7 のサポートを有効にするには、 API 呼び出しを使用してバージョンを 170 に設定する必要があります。Rhino シェルを使用している場合は-version 170、コマンド ラインで指定するか、シェルによって実行されるコードで version(170) を呼び出すことができます。

Java イテレーターをラップして JS イテレーターとして表示する JS を rhino で作成できます。

function javaIteratorToJsIterator(javaIterator) {
  return {
    next: function () {
      if (!javaIterator.hasNext()) { throw StopIteration; }
      return javaIterator.next();
    }
  };
}

別の方法として、Mozilla スタイルのジェネレーターを使用することもできますが、Rhino インタープリターを作成して有効にするオプションを付ける必要があると思います。

カスタム イテレータは便利なツールですが、内部状態を明示的に維持する必要があるため、作成には慎重なプログラミングが必要です。ジェネレーターは強力な代替手段を提供します。ジェネレーターを使用すると、独自の状態を維持できる単一の関数を記述して、反復アルゴリズムを定義できます。

ジェネレーターは、イテレーターのファクトリーとして機能する特殊なタイプの関数です。1 つ以上の yield 式が含まれている場合、関数はジェネレーターになります。

于 2012-12-13T08:14:16.973 に答える