2009-04-23 16 views
2

私はAPIを(Javaで)設計しており、ユーザーがMatlabからAPIにアクセスすることを期待しています。 (、いくつかのメカニズムを介して、例えばポーリングを)Java Objのインスタンスのホールドを取得します(バックグラウンドで)Matlab/Java APIコールバック

javaApi.waitUntilPredicateIsTrue(Predicate<JavaObj> test); 

マイAPI:問題は、私はAPIのような機能の一部を提供したいということです。これらのインスタンスの1つがPredicateに渡されると、trueと評価されるまでこのAPIメソッドをブロックします。 JavaからこのAPIを呼び出す場合は、次のようにします。

javaApi.waitUntilPredicateIsTrue(new Predicate<JavaObj>() { 
    public boolean evaluate(JavaObj jo) { 
     return "READY".equals(jo.getState()); 
    } 
}); 

これはどのようにしてMatlabから呼び出すことができますか? Matlabの匿名クラスを使用できますか? Predicateのインタフェースを拡張したMatlab classdefを宣言できますか(これはJavaの汎用バージョンに対応できますか)。

答えて

2

これは難しい質問のようです。私はまだR2006bを実行しているので変更されているかもしれませんが、MATLABは関数ハンドル(匿名関数を含む)と構造体をJavaオブジェクトに変換しないようです。構文が変更されているので、私はMATLABカスタムクラスについて知らない。文字列、配列、およびセル配列will translate properly。彼らは実装インタフェースについて全くコメントしていません。 (:p:p:p BOO HISS)

編集:ちょうどMatlab Centralでこのページを見つけました。文書化されていないインターフェイスについて話しています。

1

Matlabには、1つのメソッドを提供するだけで、クラス全体を作成するよりもはるかに良いソリューションがあります。彼らのanonymous functionsを見てください。

Matlabの匿名関数には奇数のスコープ規則があることに注意してください。リンクされたヘルプページの「式で使用される変数」セクションを必ず読んでください。より伝統的なレキシカルスコープが必要な場合は、nested functionsをご覧ください。

EDIT: Matlabからポーリングを行い、述語関数をJavaに渡さないと仮定します。例:

function waitForPredicate(pred) 
    while pred 
    end 
end 

waitForPredicate(@()javaApi.isMyConditionMet()); 
+0

残念ながらそうではありません。私は、私のAPIを最も一般的なユースケースやMatlabで使いやすくするよう努めています。基本的にAPIは、(Java)オブジェクトにアクセスするために使用されます。ただし、オブジェクトはユーザーの視点からは「準備ができていない」可能性があります。ポーリングロジック自体を実装するのではなく、単純なwaitUntilXIsReadyメカニズムを提供することを望んでいました。あなたの提案の問題は、APIに "isMyConditionMet"がないことです。彼がそれに満足しているかどうかを決定する必要があるのはMatlabのエンドユーザです –

+0

"ポーリングロジック"は "!conditionIsMet"を回転させるより複雑です。それ)。これは、新しいバージョンのオブジェクトがあなたのために準備できているからです(マルチキャストグループに公開されたイベントを介してプッシュアウトされているため)。 Matlabのユーザーが生のマルチキャストを使いこなすのは本当に嫌です! –

関連する問題