問題タブ [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 投票する
1 に答える
173 参照

indexing - ルア、2次元。"nil" の場合に値を取得する配列メタテーブル

を使用して「G」に新しいテーブルを追加しようとしています。値が であっても、テーブルから値を取得して に配置__indexする必要があります。値がテーブルにある場合、「スタック オーバーフロー」というエラーが発生します。マトリックスは対称です。値を垂直から水平に反転させました。これを修正する方法がわかりません。nilAGnilA

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

lua - メタテーブル自体の中でメタテーブル メソッドを呼び出す

メタテーブル自体の中でメタテーブル メソッドを呼び出す方法はありますか? 例えば

このエラーが発生します:

メソッド 'Sound' の呼び出しを試みます (nil 値)

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

c - Lua: ユーザーデータ オブジェクトのメタテーブルの名前を照会する

オブジェクトのメタテーブルの名前を照会したい。

次のように登録されたメタテーブルがあるとします。

ここのドキュメントにluaL_newmetatableは、二重関連付けを行うと記載されています。つまり、名前をテーブルのキーとして使用し、テーブルを名前のキーとして使用します。したがって、この知識があれば、次のように目標を達成できると思いました。

そしてそれを次のように登録しました:

しかし、残念なことに、それは機能せず、返されnilました。それで、私の悪いところは何ですか?

ここに、いくつかの完全なソース コード (C++) があります。

出力はnilです。私の Lua バージョンは 5.3 です。

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

inheritance - Lua metatable __index の配置の違い

__indexメタテーブルで を定義する 2 つの方法を見続けています。

または:

2つの動作の違いが何であるかはよくわかりません。誰かが私を啓発できますか?

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

c++ - C API を使用して Lua で代入演算子をオーバーライドする

C++ プログラムにユーザーデータとして Lua に渡すオブジェクトがあり、このユーザーデータのメタテーブルをオーバーライドして、(__newindex および __index を介して) オブジェクトのインデックスとの間で代入を行うと、代入を変換する C が呼び出されるようにします。 C++ オブジェクトに影響を与えるか、C++ 要素を Lua 値 (別のユーザーデータまたは bool、number、string などの基本型) に変換します。ユーザーデータは、C++ プログラムから呼び出されるイベントのような Lua 関数に引数として渡されます。

ただし、これにより、実際の変数自体を割り当てることはできず、変数のインデックスのみを割り当てることができます。代入演算子を直接オーバーライドするためのメタイベントがないため、回避策を探しています。

言い換えれば、私はこれを行うことができます:lua_userdata_object_passed_as_arg_to_event["is_it_true"]=true そして、Lua ブール値を内部 C++ オブジェクトに割り当てますが、これを行うと: lua_userdata_object_passed_as_arg_to_event = new_object() Lua 変数が参照するものは変更されますが、私が理解しているように、コア オブジェクトには何もしません。それ。

私が検討した回避策の 1 つは、開発者がlua_userdata_object_passed_as_arg_to_event["__self"] = new_object() オブジェクト自体を変更したい場合に行う必要のあるハックですが、これは望ましくありません。

そのため、グローバル変数を使用して代入演算子をオーバーライドし、グローバルなメタテーブル代入演算子をオーバーライドする独自の解決策をいくつか見つけましたが、誰かがこの解決策を説明するのを手伝ってくれるかどうかを探しています。http://lua-users.org/lists/lua-l/2012-01/msg00413.htmlおよびhttps://www.lua.org/pil/14.2.htmlを参照してください。特に、変数はグローバルではなく関数の引数なので、C API を介してグローバルに変換し、グローバル ユーザーデータに対して割り当てが行われた場合にアクションを実行するカスタム C 関数によって割り当てがキャプチャされるようにするにはどうすればよいでしょうか?

ちなみに、私のユーザーデータはオブジェクトへのポインターであり、それが問題になる場合は、大きなオブジェクトの複製を回避します。

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

lua - c からテーブルを呼び出したい場合、Lua PCall は __call メタ関数を呼び出すことができますか?

c API と Lua5.1 を使用してテーブルを呼び出そうとしています。

私は次の手順でそれをやっています:

  1. __callメタ関数を持つテーブル「mt」を作成します
  2. テーブル「newT」を作成し、「mt」を「newT」メタテーブルに設定します
  3. pcall「ニューT」

私の問題はステップ 3 にあります。「テーブル値を呼び出そうとしています」というエラーが表示されます。

Cでテーブルを呼び出す方法を誰か教えてもらえますか?