2012-12-13 10 views
5

私はサイコロの初心者です。Rhino内で 'for ... in'のNativeJavaObjectを有効にするにはどうすればよいですか?

現在、.NET 4およびIKVM.NETを介してRhino 1.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メソッドとプロパティにアクセスできます。

私の現在の問題は、 'for ... in'という私のNativeJavaObjectクラスをサポートすることです。 私は

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

を評価するとき、それはエラー「非オブジェクトの呼び出し 『に』いいえ」を返します。

_ イテレータ _ "のオブジェクトを検索しようとして「取得」と思われるが、それは、get()関数で「が見つかりません」になりました。だから、それは例外で終わる。 。 はこれまでのところ、私は

  • はjava.util.Iteratorの
  • リターンthis.getIds()を追加しようとしたGetEnumrator();

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

ありがとうございます!

答えて

2

__iterator__は、Mozilla specific language extensionの一部です。このリンクは、__iterator__メソッドが、イテレータが使い果たされたときにStopIterationをスローするnextメソッドを持つオブジェクトを返すことを説明しています。

あなたはしかしイテレータや発電機にopt inにあります

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

あなたはJSイテレータとしてそれを提示するためにJavaのイテレータをラップするRhinoでJSを書くことができます。

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

を別の方法として、あなたは、Mozillaスタイルの発電機を使用することができますが、私はあなたがする必要があると思いますそれらを有効にするオプション付きのRhinoインタプリタを作成します。

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

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

+0

ありがとうございました。 "__iterator___"はオブジェクトを処理するのではなく、処理する関数を探していました。私はsetLanguageVersion(170)でも試してみます。非常に有益な情報を提供してくれてありがとう! –

+0

最後にIteratorクラスを 'ScriptableObject'として作成して、NativeJavaObjectを繰り返し処理しました。今度は 'for(ドキュメント内のvar){}'と 'if(' window内の位置 '){}'を実行します。ありがとうございました! –

+0

@Yone、よろしくお願いします。ハッピースクリプティング。 –

関連する問題