1

LuaJava 経由で Lua を呼び出す Java/Scala コードがあります。J/S パイプラインから Lua パイプラインまでのオブジェクト階層の一部を模倣したいと考えています。基本的に、言語にコンパニオン オブジェクトを持たせるためです。つまり、J/S で「Cracker」を作成すると、Lua で「Cracker」オブジェクトを作成します。次に、J/SI で「eatCracker」のようなメソッドを呼び出すと、Lua コンパニオン オブジェクトの「eatCracker」も呼び出すことができます。

問題は、Lua オブジェクトを作成して保存する方法と、特定のオブジェクトでメソッドを呼び出す方法がわからないことです。

誰でも助けることができますか?

4

1 に答える 1

0

J/S から Lua インタープリターにオブジェクトをプッシュし、それへのグローバル参照を作成すると、その後実行されてオブジェクトにアクセスする Lua スクリプトは、J/S 側と同じオブジェクトにアクセスし、そのコピーではありません。 . そのため、スクリプトが終了すると、Java/Scala は、Lua スクリプトによって変更された状態 (データ メンバー) を持つオブジェクトを認識します。その後、J/S がそれを変更し、そのオブジェクトにアクセスする別のスクリプトが実行されると、そのスクリプトは、J/S によって変更された新しい状態を認識します。

したがって、メソッドを呼び出すときに模倣はありません。メソッドはオブジェクトにバインドされた関数であるため、Lua または Java/Scala から呼び出すと、同じオブジェクト (同じメモリ ブロック) がアクセスされます。

ただし、構築時には模倣が必要です。J/S でオブジェクトを構築する場合は、それを使用可能にするために明示的に Lua インタープリターにプッシュする必要があります。インタープリターによって実行される Lua スクリプトが新しいオブジェクトを作成する場合、J/S はそれを (オブジェクトを参照するグローバル変数を介して) プルする必要があります。破棄については、どちらの側 (J/S または Lua) にも参照が残っていない場合、オブジェクトが自動的にファイナライズされることに賭けます。

したがって、両方の環境に必要なオブジェクトが J/S 側でプッシュおよびプルされるようにするだけです (Lua 側は「スレーブ」です)。これを自動化するのは良い考えではないと思います。両側で必要なものだけを明示的にプッシュ/プルします。それ以上でもそれ以下でもありません。

于 2013-11-19T21:53:40.293 に答える