問題タブ [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.
binding - Luaバインディング:テーブルとユーザーデータ
C ++クラスのLuaバインディングを作成する場合、テーブルまたはuserdataオブジェクトを返す必要がありますか?
それぞれの方法の長所と短所を知っている人はいますか?
c - Lua のユーザーデータへの参照を保存する
#1 ルア:
#2C:
#3 ルア:
#4C:
編集:
疑似コードでより簡単に説明しようとします:
ルア:
子:
Lua: 新しいメソッドを作る
Cでは、いくつかのイベント(タイマーとしましょう)がCメソッドをトリガーします
問題は、CでLuaオブジェクトへのポインタを格納する方法(それが必要であることを願っています)、そのポインタでLuaオブジェクトを取得し、その中のメソッドを呼び出す方法です
lua - Lua ユーザーデータ GC
Luaユーザーデータの一部がLuaオブジェクトへの参照を保持することは可能ですか? (テーブル、または別のユーザーデータのようなものですか?)。基本的に、私が知りたいことは次のとおりです。
gc が実行されたときに、ユーザー データが次のように言うことができるような方法でユーザー データを作成できますか。
編集: lhf への応答:
私が持っているとします:
今、私はできる:
しかし、代わりに私が欲しいとしましょう:
[つまり、Vertex と Quaternion がユーザーデータの非常に大きな部分であると仮定します]。
ここで、ユーザーデータ Vertex とユーザーデータ Quaternion を受け取り、ユーザーデータ Bar を作成する Lua ユーザー関数があるとします (スペースを節約したいので、ユーザーデータ Foo は必要ありません)。 userdata Vertex*/Quaternion* は GC 処理されません。
c - Lua でユーザーデータを名前空間として設定する
私はこの主題を調査し、さまざまなアプローチを試みましたが、私が考えている動作を実装することはできません (それが可能かどうかさえわかりません)。基本的に、次のように、メタテーブルからアクセスできる C で作成されたいくつかのユーザーデータ オブジェクトがあります。
Main.lua
config.display_width = 1280
私がやりたいのは、構成名前空間を特定のスクリプトに「強制」することです。ご想像のとおり、ユーザーが構成メタテーブルのみを扱うように制限されるように、構成ファイルを保護する必要があります。このような:
Config.lua
display_width = 1280
そして、私はCで次のようなことをしなければならないことを知っています:
前もってありがとう、これは私を夢中にさせています!
PS: 記録のために、C 構造にバインドされているため、構成ユーザーデータをそのままにしておく必要があります。結果として、異なる環境間で Lua の状態や宣言された変数が「失われる」ことについては心配していません。
以下の情報を追加します。これは、構成ユーザーデータの作成方法です。
したがって、ユーザーが構成ユーザーデータから値を設定または取得するたびに、__index
または__newindex
メソッドを介して C 構造を更新します。
types - Lua の効率的なカスタム データ型
Lua で使用するための 2D ベクトルのようなデータ構造が必要です。これまでのところ、この問題に対するいくつかの解決策を見つけました。
- 純粋な Lua でデータ型を定義する従来のソリューション - 欠点は、すべての操作 (加算など) で新しいデータ型を作成し、メタテーブルを設定する必要があることです。x、y はフィールドとして格納されるため、高速にアクセスできます。
- C 側の古典的な完全なユーザーデータ ソリューション -- より高速である可能性があり、演算子を使用できます。操作コードは C 側ですが、すべての操作で新しいオブジェクトの割り当てを行う必要があります。ただし、フィールドの可能性はないため、カスタム __index/newindex 関数を実行して x と y をシミュレートする必要があります。これは Lua 側で遅くなる可能性があります。
- Lua オブジェクトを定義するが C コードを使用するハイブリッド アプローチでは、x と y は簡単にアクセスできるフィールドのままですが、関数は C でコーディングされるため、高速になりますか?
私は #1 のアプローチを試しましたが、効率の問題があるため、#2 または #3 に移行する予定ですが、どちらがより効率的かはわかりません。
反対側には、コンパイラ自体でデータ型をハードコードする可能性もありますが、私はまだそのような抜本的なアイデアの準備ができているとは思いません:) (これは思ったほどクレイジーではありません。ネイティブ Lua タイプの 2 倍のサイズに収まります)。
2 つの方法のうち、どちらがより効率的でしょうか? これらの場合、私が考えていなかった落とし穴はありますか?
c++ - LuaのLightユーザーデータへのアクセス
それらの使用法を誤解したり、ドキュメントを読み間違えたりする可能性がありますが、Luaにライトユーザーデータとして渡された構造体またはクラスのメンバーにアクセスするにはどうすればよいですか?たとえば、次の構造体を使用するベクトルの場合
'test'として宣言され、x=413およびy=612のようなものとして定義され、呼び出しでプッシュされました
xとyを操作または出力する関数のLuaコードはどのようになりますか?
java - メソッドをユーザーデータに追加する
このように既存のユーザーデータにメソッドを追加しようとしていますが、これはエラーになります。
サイトでこの例を見つけましたが、どちらも機能しません
Lua から既存のユーザーデータにメソッド/関数を追加する有効な方法はありますか
c++ - ユーザーデータを別のタイプに変更しながら、別のメタテーブルから継承するようにメタテーブルを設定するにはどうすればよいですか?
これは、Lua C API を使用して C++ で実行したいことです。
ユーザーデータを基本ユーザーデータオブジェクトから派生させる良い方法を見つけようとしています。
私はこれを行うことができるようにしたい:
それ以外の:
これらの例では、me:GetCurrentItem() はいくつかの関数でユーザーデータを返しますが、item:GetBaseObject() が返す基本関数がありません。
学習目的で Crysis Wars SDK に Lua をバインドしています。SDK は、構造体である基本エンティティへのインターフェイスを提供します。IItem 構造体 (me:GetCurrentItem()) は同じです。これらは構造体であるため、それらを基本構造体にキャストしたり、その基本関数を呼び出したりすることはできません。IEntity *GetEntity() 関数を使用する必要があります。
__index で自己ポインタを変更しようとしましたが、ローカル変数「item」が「entity」になるのは明らかですが、GetPos 関数を呼び出した後に元に戻したいのですが、これはどういうわけか非論理的です。
誰かがこの問題の良い解決策を持っていますか?
string - Lua の Wireshark ディセクタ - ユーザーデータ
Lua は初めてで、Wireshark 用のカスタム ディセクタを作成しています。私の状況はこれです:
Wireshark データは、4321 8765 CBA9 などの 16 進数で構成されます。私が巻き上げたいのは(解剖された後):CBA9 8765 4321です。
これまでに行ったことは、Lua でこれらの数値を個別に取得し、それらを文字列に変換して正しい順序に配置する小さな関数を作成することです。
ただし、この束をツリーに追加しようとすると、Lua Error: ...: calling 'add' on bad self (userdata expected, got string) というエラーが表示されます。
どうすればこれを回避できますか? まったく別のアプローチが必要ですか? 複雑なものや凝ったものを探しているわけではありません。私がする必要があるのは、私が説明したことだけです。どんな助けでも大歓迎です。
delphi - Delphiから正しいLuaユーザーデータを登録する方法は?
DelphiユーザーデータをLuaに登録することについてまだ混乱しています。原則を教えるために、Date(Time)タイプを実装しようとしました。
最初は、このタイプにはLuaがアクセスできる3つの機能が必要です。
new
このタイプの変数を作成する関数。getdate
関数。- と
setdate
関数。
最後に、この小さなLuaスクリプトが機能するはずです。
( Luaの本のプログラミングを使用して)自分で実装しようとしましたが、 _attempt to index global 'DT' (a userdata value)_
2行目で次のようなエラーが表示されます。ユーザーデータの登録に問題があった可能性がありますが、エラーを見つけるのに問題があります。
あなたが私がそれを見つけるのを手伝ってくれることを願っています、これが私がすでに得たものです:
luaL_register関数についてはよくわかりません(?で呼び出す必要のあるライブラリを作成することによってのみ機能します)。また、関数を次require
のように置き換えようとしました。RegisterDateTime
残念ながら、RegisterDateTimeの両方のバージョンでの効果(エラーメッセージ;))は同じです。これらは、スクリプトが開始する前に、Delphiプログラムで直接呼び出されます(「RegisterDateTime」と「newdatetime」にブレークポイントを設定することでこれを確認しました。両方の関数がこの順序で呼び出されます。したがって、エラーはこの2つの関数のいずれかにある必要があります。I簡単なことだとほぼ確信していますが、私はそれを見るのを盲目にしています。:(