問題タブ [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.
lua - lua metatable __lt__le__eq戻り値の強制ブール変換
、、をメタテーブルにオーバーロードする__eq
と__lt
、__le
常に戻り値がブール値に変換されます。
実際の戻り値にアクセスする方法はありますか?
これは、引数の式ツリーを作成するために、次の小さなluaスクリプトで使用されます
利用方法:
print(_.a == _.b)
ただし、戻り値がブール値に変換されるため、機能しません
ps:printは、後で式ツリーを処理する関数に置き換える必要があります
--luaスクリプトから切り取ります-
-スナップ-
lua vmを変更することはオプションですが、公式リリースを使用できればいいのですが
oop - Luaメタテーブルとメタメソッド-別のメンバー関数を呼び出す方法
私は次のクラスを持っています
これが行うことは、アクセスすると(別のクラスのオブジェクトである)でtable[key]
ルックアップを実行し、nilでない場合はを返します。table.__group
table.__group[key]
今、私はメンバー関数に対して同じことをしようとしています。つまりtable:key()
、ルックアップを呼び出す場合はで実行する必要がありtable.__group
、関数が存在する場合は、を呼び出す必要がありtable.__group:key()
ます。
どうすればこれを達成できますか?
私はこれをやろうとしました。
しかし、ここには2つの問題があります。
- 元の関数の引数を取得できません
- イベント
table[key].function
を呼び出さずにアクセスするだけで、関数が呼び出されます
そして、私は物事を複雑にしようとしていると感じており、解決策ははるかに簡単です。
どんな助けでも大歓迎です。
アップデート
@Mud元のコードの問題は、メンバー関数に「self」として渡されたオブジェクトが新しいクラスのオブジェクトであるということです。古いクラスではありません。
このコードを検討してください
上記のコードで、When progress_object:showSum(3,3)
が呼び出されると、progress_objectの代わりにgroup_object(つまりprogress_object .__ group)をselfとして渡すことができますか。
それが理にかなっていることを願っています。
reference - Lua で Metatables を使用する場合、値が設定されているか取得されているかを判断する方法はありますか?
スクリプト内に「疑似 oop」システムをセットアップして、アプリケーションから UserData をより適切に操作できるようにしました。私のシステムは、参照を渡さず、値を渡すことを除いて、非常にうまく機能します。このため、次のようなことを言うと:
World.Body.Parent=World.Body2
Body
s 親を実際に他のボディに設定することはないため、実際には何も起こりません。代わりに、次のように単純化します。
World=World.Body2
(World
は の親であるBody
ため、返されます)。一方、このようなことをすると、次のようになります。
print(World.Body.Parent.Type)
==>World
World
オブジェクトを正しく取得したためです(の親ですBody
)。
これをすべて念頭に置いて、実際にオブジェクトを送信するのではなく、参照によって渡されることを確認する方法はありますか? どんなアイデアでも大歓迎です!
私が使用している関連するソースコードは次のとおりです。
lua - こんにちは metatable.__len ワールド
Lua とmetatablesに関する初心者向けの質問です。Hello ‑World のように単純な例で、len
イベントに関係していますが、残念ながら期待される結果が返されません (Ubuntu の公式リポジトリからインストールされた Lua 5.1 を使用しています)。
ケース
次に例を示します。
そして、私が得る結果:
最初の print ステートメントで が表示されることを期待していましたが、驚いたことに1
が表示されます。0
私は何を逃したのですか?
Lua Reference Manual — Metatables and Metamethodsによると、#
これは次のようになります。
だからprint (#a_test);
、print(getmetatable(a_test).__len(a_test));
同じ結果になるはずですよね?
ところで、上記のリファレンス マニュアルからの抜粋が参照されmetatable(op)
ているはずなのに、なぜ参照されているのgetmetatable(op)
でしょうか。少なくとも試してみましprint(metatable(a_test).__len(a_test));
たが、エラーになります。
答え
Nneonneoが気付いたように、これは使用中の Lua バージョンの問題です。上記が動作するにはLua 5.2が必要なようです。
c++ - Lua OOP関数が呼び出されていませんか?
Allegro 5 で Lua と LuaBridge を使用しています。すべてのグラフィック オブジェクトを Lua に移植することにしましたが、いくつかの問題が発生しています。
一度呼び出される文字クラス
関数がメイン プログラムから呼び出される Lua スクリプト:
基本的に、スクリプトは適切な座標と画像でキャラクターを初期化し、それを描画しますが、ロジックが呼び出されていない (ロジック ループ内にある) か、X 座標を変更する関数に問題があります。
また、タスク マネージャーは、C++ で画像オブジェクトを持っていたときには発生しなかった、サイクルごとに約 30 KB のメモリ リークがあることを示唆しています。
必要な場合に備えて、LuaBridge 経由で Lua にエクスポートされた Bitmap 構造体のスニペットを次に示します。
更新: 私が把握できたことの 1 つは、メモリ リークがCoreLogicから発生していることです。C++ での呼び出しをコメント アウトすると、メモリ リークはなくなりましたが、呼び出しをそのままにして、CoreLogicの内容をコメント アウトすると、リークは続きました。うーん...
2 番目の更新: メモリ リークは、私が投稿していない AI の何かに絞り込まれました。
また、CoreLogic関数ではFoo.AI:DoBehavior()を呼び出しますが、これはまったく何もせず、メモリ リークを引き起こしました。
c - Lua C APIコードは__newindex関数を呼び出さず、他の関数を呼び出します
__newindex
カスタム関数とand__index
関数の登録を2つの別々の関数に分離するためのコードをいくつか作成しました。私のコードの目標は、特異性のサブレベルに基づいて編成された関数と変数をLuaスクリプトライターに表示することです。たとえば、ユーザーは次のコマンドを使用できます。
つまり、基本的には2層のシステムで、次に関数呼び出しまたは変数があります。私がLuaを正しく理解していれば、それはテーブル内のテーブル内のメタテーブルです。ユーザーが変数を設定するときは、呼び出しをトリップする必要があり__newindex
ます(値の設定を処理するだけでなく、モーターを介してアニメーション化する物理オブジェクトにアクセスするため)。また、テーブルのチーフテーブルには、それがであるかorc
どうかに関係なく、割り当てられた多くの関数が表示されていると思います。コードの開発中に新しい変数と関数を簡単に追加できるように、2つの関数を作成しました。1つは関数を作成するためのもので、もう1つは変数を作成するためのものです。関数は関数と変数を登録するだけですattack
__newindex
create
create
新しいテーブル要素を作成し、との関数を登録するだけ__newindex
です__index
。以下はコードです:
次に、私の中でmain()
次のような関数を呼び出します。
コードを実行してLuaスクリプトでポンピングするorc.chief.attack()
と、OrcAttack()
関数が呼び出されますが、関数orc.chief.hp = 100
は呼び出されませんorcChief__newindex()
。registerFunctions
彼らが何らかの形で干渉していてregisterIntegerVariable
、それだけではまだorcChief__newindex().
アイデアを引き起こさない場合に備えて、私は電話をコメントアウトしましたか?
garbage-collection - Lua __gcメタメソッドがテーブル(Lua 5.2.1)で機能するようになりましたか?
以前読んだことがあるので、少し驚いています__gc
。メタメソッドはユーザーデータに対してのみ呼び出され、テーブルに対しては呼び出されません。(LuaFAQ:__gcおよび__lenメタメソッドがテーブルで機能しないのはなぜですか?)
しかし、最近、私はそれを試してみて、それが実際に機能することを発見しました!Lua5.2.1でこのコードを試してください。
しかし、この変更ログはどこにも見つからないので、少しイライラして使用することを恐れています。
たぶん、誰かが私の提案を証明することができますか?それとも、文書化されていない動作ですか?私の場合、テーブルデストラクタを定期的に作成する方法があると便利です。私の観察が正しければ嬉しいです。
lua - Luaに存在しない関数への呼び出しをキャッチする
そこから何が呼び出されようとしたのかを教えてくれる簡単なモックテーブルを作成したいと思います。
私の最初の試みは:
今これをと呼んでいます
私が期待したように印刷します:
しかし、電話をかけようとしています:
与える:
今私は2つの質問があります:
- 例外を回避する方法、すなわち。私は何が間違っているのですか?
- メソッド引数(この場合は「bar」)もキャッチする方法は?
syntax - Lua Metatables - コロン構文で関数を呼び出す
私は次の問題を抱えています、誰かが私を助けることができますか?
pru.gr:insert(display.newImage("wakatuBlue.png"))
-- この行は機能しますが、プロパティを使用して挿入メソッドにアクセスしたくありませんgr
。挿入メソッドを直接呼び出したいのですが、メタテーブル__index
関数が機能します。
pru:insert(display.newImage("wakatuBlue.png"))
-- この行は機能しません。"bad argument #-2 to 'insert' (Proxy expected, got nil)"
エラーが発生しました。これが私が使用しようとしている方法です。
oop - Lua(5.2)でOOPのためにメタテーブルはどのような目的を果たしますか?
メタテーブルがどのように機能するのか、そしてクラスの作成と継承のためにメタテーブルがLuaで必要な理由を理解するのに苦労しています。Luaで見つけたすべてのOOPの例は、前回とは少し異なりますが、特に__index
プロパティに対しては常にメタテーブルを使用します。これが私がいくつかの単純な継承を実装した方法です:
出力:
私が見る限り、これは問題なく機能します。メタテーブルを使用すると、デザインがどのように改善されますか?