問題タブ [lua-userdata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ で Lua ユーザーデータをすべて削除する
これは私の問題であるため、すべてのユーザーデータ「テーブル」(ユーザーデータテーブルと呼ばれますか?)にアクセスしてLuaから削除できるかどうか疑問に思っています:
ご覧のとおり、最初にオブジェクトを作成し、マップ クラスで "new" を使用して割り当てられた Object という名前の C++ クラスへのポインターを保存します。次に、オブジェクトを削除します。つまり、マップ クラスのポインターに割り当てられたメモリを削除します。そして最後に SetPosition を呼び出します。メモリがまだ c++ オブジェクト クラスに割り当てられている場合は、すべてが楽しく実行されます。しかし、それが削除の場合 (この場合は SetPosition(...) 呼び出しの前に Delete() を呼び出したため)、私のプログラムはクラッシュします。だから私が疑問に思っているのは次のとおりです:
Delete を呼び出して、lua の変数 'a' を nil に設定することは可能ですか? Delete が nil を返す場合、「a = a:Delete()」のようなことができることはわかっていますが、「a =」の部分を忘れると失敗します。また、ユーザーデータを削除して、SetPositon() を呼び出すときに存在しないかどうかを確認することが可能かどうか疑問に思っています。そうでない場合は、単に戻ります。
lua - Luaは奇妙な数の引数を持つメタメソッドを許可しますか?
たとえば、__index
2つの引数を取るメタメソッドを宣言してから、次のようなことを行うことはできますmyuserdata[somearg1, somearg2]
か?私はそれを使いたいというわけではなく、なぜそれが役立つのか考えているわけではありません。c++をLuaにバインドすることを扱うライブラリで、権利を強制できるかどうか、そして強制する必要があるかどうか疑問に思っています(__call
もちろんメタメソッドを除く) metamethodとしてバインドされた関数の引数の数。
c++ - Lua RPC とユーザーデータ
現在、プログラムで luarpc を使用してプロセス間通信を行っています。問題は、クラスインスタンスをユーザーデータとして保存する tolua++ バインディングが原因で、これらの関数を使用できないため、luarpc がユーザーデータを処理できないことです。私の質問は、ユーザーデータが常にポインター (4 バイト) のみであり、呼び出しおよびインデックス作成操作用にメタテーブルが添付されていることがわかっている場合、ユーザーデータを送信できるかどうか (およびその方法) です。
c++ - Lua ユーザーデータ オブジェクト管理
Lua クラス オブジェクトをスタックにプッシュしようとしています。そのオブジェクトへのポインターは、複数の関数から返すことができます。
言い換えれば、「==」、「~=」などを使用する機能を維持しながらユーザーデータ値をプッシュする必要があるため、同じC++オブジェクトの場合、ユーザーデータポインターは同じでなければなりません。
firstObject は lua スクリプトによって保存され、後でコードでこれを再度実行する必要があります。
私の Push 関数は基本的に、どこかに同じ C++ クラス ポインターがあるかどうかを確認し、関連付けられているユーザーデータ ポインターをプッシュする必要があります (どのようにプッシュしても、オブジェクトは 1:1 で同じように動作するはずです)。
そうでない場合は、新しいユーザーデータを作成 (スタックにプッシュ) し、その内容をクラス オブジェクトに設定する必要があります。
これが私のコードです:
LuaToUData は、lua エラーをスローしないように記述した独自の関数です。
c - C API からユーザーデータの Lua 変数にアクセスする
Lua をスクリプト言語として使用する C++ で書かれたプロジェクトに取り組んでいます。デバッグを容易にするために、Lua コードを受信して実行し、戻り値を Json にエンコードして、その文字列を送り返すネットワーク デバッガーを実装しました。
私はテーブルにそれを実装することができましたが、今はユーザーデータに格納されている変数にこだわっています。たとえば、次の Lua コードがあります。
Application
、Avatar
およびPhysics
C++ で作成されたオブジェクトです。ただし、この 2 つtestVars
は上記のスクリプトで作成されています。
Elements
はテーブルなので、すべての要素を一覧表示できますが、 が でAvatar.testVar
あるため非表示になっているようAvatar
ですLUA_TUSERDATA
。
Lua のユーザーデータに追加された変数を検出する方法を知っている人はいますか?
c# - Lua でユーザーデータのプロパティとメソッドにアクセスする
LuaInterface でのユーザーデータ型へのアクセスに関して質問があります。C# ディクショナリを Lua に渡し、ipairs を使用してそれを繰り返し処理しようとすると、ipairs はユーザーデータ オブジェクトではなくテーブルを想定しているため、エラーが発生します。
解決策の 1 つは、Dictionary 型を LuaTable 型に変換してから Lua に渡すことだと思いますが、userdata 型を入れたい用途の 1 つは、Dictionary オブジェクトを Lua に取り込み、customType オブジェクトのフィールドを更新することです。 Lua でメソッドを呼び出します。これが可能かどうかはわかりませんが、その Dictionary を文字列と int の LuaTable に変換すると、Lua から customType と直接やり取りする機会が失われることは間違いありません。
Lua でのユーザーデータの操作に関する情報をオンラインで調べましたが、C/C++ を介した Lua とのインターフェイスと、よくわからないスタックを見つけたいくつかの例を見つけました。また、場合によっては sizeof メソッドが使用されますが、これは c# では簡単な代替手段がありません。誰かが私にいくつかの指針を教えてもらえますか? C のユーザー定義型に関する PIL セクションもあまり役に立ちませんでした。
hash - Luaライトのユーザーデータ
Lua に問題があり、正しい方向に進んでいるかどうかわかりません。C++ には、リソース マネージャーにパラメーターを渡すために使用する辞書があります。この辞書は、ハッシュと文字列のマップに非常に似ています。
Lua ではこれらのリソースにアクセスしたいので、ハッシュの表現が必要です。また、ハッシュは一意である必要があり、テーブル内のインデックスとして使用されます。私たちのハッシュ関数は 64 ビットで、私は 32 ビット環境 (PS3) で作業しています。
C++ 私はそのようなものを持っています:
Lua では、これらのリソースを使用して、他のユーザーデータのファクトリを作成します。私は次のようなことをします:
したがって、パラメータは Lua によって作成される場合もあれば、C++ によって作成される場合もあります。myhashkey ('vehicleId')
はテーブルのインデックスであるため、一意である必要があります。uint64_t を実装するために lightuserdata を使用しましたが、32 ビット環境にいるため、単純int64
にポインターに格納することはできません。:(
プログラムで使用されるすべてを格納するテーブルを作成しint64
、参照をユーザーデータに保存する必要があります。
ただし、ユーザーデータがガベージ コレクションされることはありません。その後、int64 が解放されることはなく、テーブルは永遠に大きくなります。また、lightuserdata はメタデータへの参照を保持しないため、他の light userdata と干渉します。実装を確認すると、L->G_->mt_[2] にメタデータ テーブルが追加されています。それをやって
のメタテーブルを使用しますb
。
メタテーブルが型にバインドされていると思いました。現在の実装 lightuserdata の使用例は非常に限られているため、かなり混乱しています。
Python では、型が辞書のインデックスとして使用されるたびに呼び出されるハッシュメタ関数があります。似たようなことをすることは可能ですか?
私の英語でごめんなさい、私はイタリア出身です。:-/
c++ - LuaコードでSWIGのユーザーデータを拡張するには?
SWIG を使用して C++ コードを Lua にバインドしています。これまでのところ問題ないように見えますが、Lua 内から単一のユーザーデータを「チート」して拡張し、カスタム フィールドやメソッドなどを追加する必要があります。
SWIG のディレクティブ内で作業しているときに、それを達成する方法が見つかりません。ラッパー コードのどこでマジックが行われるかはわかっていますが、__index と __newindex がどのように機能するかは完全にはわかりません。また、SWIG は __setitem と __getitem を使用しており、「/* NEW: __setitem() fn を検索します。これはユーザーが提供する set fn */ です」とコメントされています。これが何を意味するのかもわかりません。最後に、私の環境では、各ビルドの前に SWIG ディレクティブを C++ ラッパーにバインドするスクリプトが自動的に呼び出されるため、再コンパイルまたは Lua バインディングの追加を選択した場合、後でソースを変更するのは非常に面倒です。
これまでのところ、私の唯一の結論は、この機能が文書化されている toLua++ を使用することです。多くの移行作業を避けるのを手伝ってください!
編集: 5.2 で「lua_setuservalue」API 呼び出しも見つかりました。便利なようですが、すべての SWIG バインディング コードのどこで呼び出すかわかりません。
編集:物事を片付けるには:
C関数を持ってオブジェクトを作成します
この関数は、そのプロトタイプを *.i swig 定義に含めることによって、SWIG によってバインドされます。
Lua では、次のようなコードを記述します。
編集:前進!Scholii の指示に従い、次の Lua コードを書きました。ここで、「ground」はバインドされた C++ コードを使用して以前に取得されたユーザーデータです。コードは __index と __newindex の swig のバージョンを格納し、次に別の ("_other") テーブルを最初にクエリするこれらの関数を再作成します。
ここでの私の現在の問題は、「_other」テーブルに格納された新しい値が、そのタイプのすべてのユーザーデータ オブジェクト間で共有されることです。つまり、ground.nameFoo = "ha!" の場合、他のすべてのオブジェクトには "ha!" を格納する nameFoo フィールドがあります。これを修正するにはどうすればよいですか?
編集: この回答からソリューションを実装しました: Add members dynamic to a class using Lua + SWIG
問題は、オブジェクト タイプがユーザーデータではなく、テーブルになっていることです。つまり、ユーザーデータを引数として取る他のバインドされた C++ 関数に引数として有機的に渡すことができなくなりました。これに対する解決策はありますか?そして、ユーザーデータ オブジェクトを返すすべての関数に対してこれを行う必要があります。