私はユーザーデータとしてLuaに渡すC++プログラム内のオブジェクトを持っています。このユーザーデータのメタテーブルをオーバーライドして、__newindexと__indexを介して、 Cへの呼び出しが行われ、C++オブジェクトに影響を与えるように代入を変換するか、C++要素をLua値(別のユーザーデータまたはbool、number、stringなどの基本型)に変換します。 userdataは、C++プログラムから呼び出されるイベント型のLua関数の引数として渡されます。CのAPIを使用してLuaの代入演算子をオーバーライド
luaL_newmetatable(L, "object");
lua_pushstring(L, "__index");
lua_pushvalue(L, -2); /* pushes the metatable */
lua_settable(L, -3); /* metatable.__index = metatable */
luaL_openlib(L, NULL, vallib_m, 0);
luaL_openlib(L, "internal", vallib_f, 0);
lua_pushstring(L, "__index");
lua_pushstring(L, "get");
lua_gettable(L, 2); /* get val.get */
lua_settable(L, 1); /* metatable.__index = val.get */
lua_pushstring(L, "__newindex");
lua_pushstring(L, "set");
lua_gettable(L, 2); /* get array.set */
lua_settable(L, 1); /* metatable.__newindex = val.set */
ただし、実際の変数自体を割り当てることはできません。変数のインデックスのみを割り当てることはできません。代入演算子を直接オーバーライドするためのメタイベントはないので、回避策を探しています。 lua_userdata_object_passed_as_arg_to_event["is_it_true"]=true
をし、それがLuaは私の内部のC++オブジェクトにブール割り当てますが、私がしなければ、この:つまり
、私はこれを行うことができます はlua_userdata_object_passed_as_arg_to_event = new_object()
それは何Luaの変数の参照を変更しますが、それはしません私が理解している限り、コアオブジェクトに何かをしてください。
私が考えた解決策の1つは、オブジェクト自体を変更したい場合には、開発者には、lua_userdata_object_passed_as_arg_to_event["__self"] = new_object()
を実行する必要がありますが、これは望ましくありません。
グローバル変数を使用してグローバル演算子の代入演算子をオーバーライドする代入演算子をオーバーライドするためのいくつかのユニークな解決策を見つけましたが、誰でもこの解決策を解説することができますか? http://lua-users.org/lists/lua-l/2012-01/msg00413.htmlおよびhttps://www.lua.org/pil/14.2.htmlを参照してください。 特に、私の変数は関数の引数でありグローバルではないので、C APIを使ってグローバルに変換することで、割り当てがグローバルなユーザデータに対して起こっている場合にアクションを起こすカスタムC関数によってどの割り当てをキャプチャすることができますか?
ところで、私のuserdataは大きなオブジェクトの複製を避けるためのオブジェクトへのポインタです。
質問の目的は、Luaをユーザーフレンドリーにすることです。私が述べたように、パズルに残っている残った部分は1つだけです。Cの関数引数を現在のLuaコンテキストのグローバル変数metatableに追加します。私はこれが可能だと信じていますが、幅広く異なるアプリケーションに散在しているさまざまなコンポーネントだけを見ているので、それらを一緒にまとめようとしています。可能であれば、そう、ライブラリでassign()を宣言するか、 "__self"のようなカスタムインデックスを使うようなことをやります... – Leo
@Leo: "*質問の目的は、 - フレンドリー* "しかし、ルア*は"ユーザーフレンドリー "です。それは "C/C++とまったく同じ"ものではありません。ある種類のグローバルとして関数のパラメータを渡し、それらを関数で取得したい場合は、そうすることができます。しかし、Luaでは、彼らは関数の引数のように見えません。そして、それでも、任意の 'local'変数がこれに参加できないという事実は変わりません。 –