問題タブ [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.

0 投票する
3 に答える
620 参照

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)

0 投票する
2 に答える
461 参照

lua - 呼び出し可能な Lua テーブルが自分自身を __call の引数として渡さないようにするにはどうすればよいですか?

次のコードがあるとします。

印刷する代わりに:

それは印刷します:

テーブルの ID は の ID ですt

print直接呼び出したかのように動作させるにはどうすればよいですか?

0 投票する
2 に答える
206 参照

oop - Luaオブジェクトテーブルがオブジェクトインスタンス間でリークしているが、レコードはリークしていない

私はLuaを学ぼうとしているので、これが簡単に答えられる質問であることを願っています。次のコードは機能しません。変数childContextは、クラスのすべてのインスタンス間でリークします。

リークしているオブジェクト指向のluaクラスを見ると、コンストラクター関数を次のように変更することで問題を修正できます。

だから私の質問は:

  1. 最初の例のように、クラス変数を宣言するためのよりクリーンな方法があるので、コンストラクターに含める必要はありませんか?
  2. CxBR_Context.nameが機能するのに、テーブルCxBR_Context.childContextsが機能しないのはなぜですか?
0 投票する
1 に答える
74 参照

inheritance - 不変型から継承しますか?

クラスを継承することを「必要とする」Pythonの質問に答えましたintPythonの不変型)。最近Luaをやっていて、質問に答えながら思った。「これは Lua でどのように行われますか?」

では、Lua で不変型からクラスを継承できますか? はいの場合、どのように?また、整数などのクラスから継承できない場合、Python の質問に対する私の回答と同様の動作を実装する別の方法はありますか?

補足として、私はまだ Lua のメタテーブルを理解するのにかなり苦労しています。

0 投票する
1 に答える
444 参照

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関連付けられた値を返す関数アプローチをスニペットに実装することにしましたが、うまくいきました。確かに と (から適応)は同じ効果があります。keyB__index = AB__index = function(t,key) return A[key] end

明確化をいただければ幸いです。

0 投票する
2 に答える
9815 参照

lua - Metatable.__index について説明が必要です

前に、メタテーブルのメソッドが Lua によって検索されない理由を尋ねたところ、メタテーブルに設定__indexすることで問題が解決すると言われました。しかし、インデックスブラケット[]メタ__indexテーブルを使用する必要があるため、その中のテーブルからインデックスを返すように割り当てられているため、メソッドを使用して両方の機能のニーズを解決するにはどうすればよいですか?割り出しブラケット

問題を示す最小限の例を書きました。

0 投票する
2 に答える
4046 参照

lua - Lua メタテーブルを非表示にして、オブジェクトの属性のみを公開する

メソッドではなく属性のみを公開する Lua オブジェクトを作成するにはどうすればよいでしょうか? 例えば:

プロデュース:

また、Lua で OOP のコロン構文を使用しないことは可能ですか? 継承もポリモーフィズムも必要ありません。カプセル化とプライバシーだけが必要です。