2016-08-16 6 views
3

私はユーザーデータとして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は大きなオブジェクトの複製を避けるためのオブジェクトへのポインタです。

答えて

3

ルアとC/C++は異なるニーズの異なる言語です。 C/C++では、変数は常にという特定のオブジェクトを参照します。このオブジェクトの内容を変更することはできますが、異なるオブジェクトを変数として扱うことは決してできません。 a = b;の場合はbの値をaにコピーしています。 aが何を話しているのか決して変更することはできません。

ルアでは、変数はではありません。は何も参照していません。したがって、変数が現在保持しているオブジェクトとそのオブジェクトの値との間には区別があります。

あなたのkludgeはグローバル変数関数ですが、local変数は実際には存在しないものです。それらはLuaスタック上の場所です。 Luaのデフォルト動作を無視することはできません。

これを処理する最善の方法は、を受け入れます。 CとLuaの違いです。あなたがLuaでコードを書く方法で、Luaにコードを書いてください。 LuaコードをCのように動作させようとしないでください。その方法は愚かです。彼らは異なる言語であり、あなたはそれらの違いを受け入れるべきです。

a = b相当の機能をLuaに与えたい場合は、assignなどのタイプの関数を作成するか、オブジェクトの値に割り当てることができます。あるテーブルから別のテーブルにすべてのテーブル要素をコピーする場合と同じように、そのための関数を記述する必要があります。

+0

質問の目的は、Luaをユーザーフレンドリーにすることです。私が述べたように、パズルに残っている残った部分は1つだけです。Cの関数引数を現在のLuaコンテキストのグローバル変数metatableに追加します。私はこれが可能だと信じていますが、幅広く異なるアプリケーションに散在しているさまざまなコンポーネントだけを見ているので、それらを一緒にまとめようとしています。可能であれば、そう、ライブラリでassign()を宣言するか、 "__self"のようなカスタムインデックスを使うようなことをやります... – Leo

+0

@Leo: "*質問の目的は、 - フレンドリー* "しかし、ルア*は"ユーザーフレンドリー "です。それは "C/C++とまったく同じ"ものではありません。ある種類のグローバルとして関数のパラメータを渡し、それらを関数で取得したい場合は、そうすることができます。しかし、Luaでは、彼らは関数の引数のように見えません。そして、それでも、任意の 'local'変数がこれに参加できないという事実は変わりません。 –

関連する問題