問題タブ [metatable]
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++ - Lua、C++、消えるメタテーブル
バックグラウンド
Bitfighter というゲームで Watusimoto と仕事をしています。LuaWrapper のバリエーションを使用して、c++ オブジェクトをゲーム内の Lua オブジェクトに接続します。また、 lua-vecと呼ばれる Lua のバリエーションを使用して、ベクトル操作を高速化します。
私たちはしばらくの間、解決できなかったバグを解決するために取り組んできました。メタテーブルの破損を示唆するランダムなクラッシュが発生します。この問題に関する Watusimoto の投稿については、こちらを参照してください。メタテーブルが破損しているためかどうかはわかりませんが、ここで質問したい奇妙な動作が見られました。
問題の顕在化
例として、オブジェクトを作成し、次のようにレベルに追加します。
ただし、ゲームがクラッシュすることがあります (常にではありません)。エラーあり:
上記の Watusimoto の投稿への回答で与えられた提案を使用して、最後の行を次のように変更しました。
これは、そこlevelgen
からメソッドを間違って呼び出した場合に、if 何かのメタテーブルを出力します。
ただし、これはクレイジーです。失敗してメタテーブルを出力すると、メタテーブルはまさにaddItem
(正しい呼び出しとすべてで)あるべき姿になります。levelgen
スクリプトの読み込み時にメタテーブルを出力し、pcall
上記の使用に失敗した場合、それらは同一であり、ユーザーデータへのすべての呼び出しとポインターは同じである必要があります。
メタテーブル forlevelgen
がランダムに自然に消えていくようなものです。
何が起こっているのか誰にも分かりますか?
ありがとうございました
注:levelgen
これは、オブジェクトだけでは発生しません。たとえば、TestItem
上記のオブジェクトでも発生しています。実際、同じコードが自分のコンピューターの行levelgen:addItem(t)
でクラッシュしますが、別の開発者のコンピューターでt:setText("hello")
は同じエラー メッセージの行でクラッシュします。missing or unknown method 'setText' (a nil value)
lua - 呼び出し可能な Lua テーブルが自分自身を __call の引数として渡さないようにするにはどうすればよいですか?
次のコードがあるとします。
印刷する代わりに:
それは印刷します:
テーブルの ID は の ID ですt
。
print
直接呼び出したかのように動作させるにはどうすればよいですか?
oop - Luaオブジェクトテーブルがオブジェクトインスタンス間でリークしているが、レコードはリークしていない
私はLuaを学ぼうとしているので、これが簡単に答えられる質問であることを願っています。次のコードは機能しません。変数childContextは、クラスのすべてのインスタンス間でリークします。
リークしているオブジェクト指向のluaクラスを見ると、コンストラクター関数を次のように変更することで問題を修正できます。
だから私の質問は:
- 最初の例のように、クラス変数を宣言するためのよりクリーンな方法があるので、コンストラクターに含める必要はありませんか?
- CxBR_Context.nameが機能するのに、テーブルCxBR_Context.childContextsが機能しないのはなぜですか?
inheritance - 不変型から継承しますか?
クラスを継承することを「必要とする」Pythonの質問に答えました(int
Pythonの不変型)。最近Luaをやっていて、質問に答えながら思った。「これは Lua でどのように行われますか?」
では、Lua で不変型からクラスを継承できますか? はいの場合、どのように?また、整数などのクラスから継承できない場合、Python の質問に対する私の回答と同様の動作を実装する別の方法はありますか?
補足として、私はまだ Lua のメタテーブルを理解するのにかなり苦労しています。
lua - Lua メタテーブルの矛盾
__index
これらと例の間でメタメソッドの動作に違いがある理由を理解するのに苦労しています:
次のエラーが発生します。lua: l.lua:8: attempt to call method 'speak' (a nil value)
一方
期待どおりに実行され、 が出力されI'm an B
ます。
なぜそうなったのかを理解しようとして、PiL のこのセクションを読みました。それは次のように述べています:
継承のための __index メタメソッドの使用は非常に一般的であるため、Lua はショートカットを提供します。名前にもかかわらず、__index メタメソッドは関数である必要はありません。代わりに、テーブルにすることができます。関数の場合、Lua はテーブルと存在しないキーを引数として呼び出します。テーブルの場合、Lua はそのテーブルへのアクセスをやり直します。
これについての私の理解では、「A」を含むスニペットでは__index = A
、アクセスがテーブルで行われるようになっていますA
(上記の引用の太字のセグメントに従って)。この場合、キーに関連付けられた関数が見つからない理由がわかりません"speak"
。これを修正しようとして、inにB
関連付けられた値を返す関数アプローチをスニペットに実装することにしましたが、うまくいきました。確かに と (から適応)は同じ効果があります。key
B
__index = A
B
__index = function(t,key) return A[key] end
明確化をいただければ幸いです。
lua - Metatable.__index について説明が必要です
前に、メタテーブルのメソッドが Lua によって検索されない理由を尋ねたところ、メタテーブルに設定__index
することで問題が解決すると言われました。しかし、インデックスブラケット[
と]
メタ__index
テーブルを使用する必要があるため、その中のテーブルからインデックスを返すように割り当てられているため、メソッドを使用して両方の機能のニーズを解決するにはどうすればよいですか?割り出しブラケット
問題を示す最小限の例を書きました。
lua - Lua メタテーブルを非表示にして、オブジェクトの属性のみを公開する
メソッドではなく属性のみを公開する Lua オブジェクトを作成するにはどうすればよいでしょうか? 例えば:
プロデュース:
また、Lua で OOP のコロン構文を使用しないことは可能ですか? 継承もポリモーフィズムも必要ありません。カプセル化とプライバシーだけが必要です。