問題タブ [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 に答える
151 参照

string - Lua にベアワードを追加する

lua 内でドメイン固有言語を実装するために、言語にベアワードを追加したいと考えています。したがって、それ print("foo")は次のように書くことができますprint(foo)

私がこれを行った方法は、環境テーブルのメタテーブルを変更すること_Gです。

変数の値を取得するにfoo_G.foo_G["foo"]

これは良いアプローチですか?隠れた欠点はありますか?より良い方法はありますか?ベアワードが特定のファイル内でのみ機能するようにすることはできますか? (おそらく、別の luascript から を使用してそのファイルを実行することによってloadstring)

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

c# - LuaInterface C# Metatables

I have some background lua codes and I load them on each startup, They work fine, But Is there any way I can convert them to C#?

Here Is my meta table codes:

It works fine, Here Is how currently my codes work:

Currently I search a Player.cs object using a void at my registering lua functions code, I don't have any special void or function on my C# code that has Player object on It, But I want to change all of them to Player object, Also Is there any way I can use the Player.cs voids/strings or anything from lua without registerting them? Player.cs objects are non-static.

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

c++ - Lua C API - スタック上のテーブルからメタテーブルを取得する

関数に渡されたテーブルがあり、次のようにスタックの一番上にあるとしましょう。

スタック上のそのテーブルからメタテーブルを取得することは可能ですか? 次のように、既知の名前の識別子を使用して簡単に取得できます。

しかし、関数を再利用して、スタック内のテーブルからメタテーブルを取得したいと考えています。

おそらくこれを行う簡単な方法がありますが、これを行う関数が見つからないようです。

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

c++ - luaでは、関数の代わりにユーザーデータ値にupvalueをバインドする方法はありますか?

次の例でuserdataは、型の値が作成され、を呼び出すMyTypeメタ関数でテーブルが作成されます。このコードは、クロージャ ベースの lua OOP を作成します。提供された例に対する私の不満は、upv​​alues を介してメソッド呼び出しに関連付ける方法が 1 つしかないように見えることです。インスタンス間で同じメタテーブルを共有したい場合を除き、それ自体は問題ありません。__tostringLI_MyType__tostringuserdata

理想的な世界では、そして私がこの質問で明らかにしたいと思っていることですが、upvalue をuserdata介して関数呼び出しに関連付けずに、upvalue を値 (たとえば ) に関連付ける方法はありますか? クロージャーベースの lua OOPを引き続き使用し、インスタンス間で同じメタテーブルを共有できるトリックがあることを願っています。私は楽観的ではありませんが、誰かに提案や自明ではないトリックがあるかどうかを尋ねたいと思いました。

次のようなことを実行する方法があることを願っています (これは疑似コードです!):

これは、OOP の「通常の」メタテーブル スタイルの場合と似ていることはわかっていますが、クロージャ ベースを維持し、コロン構文の導入を避けたいと考えています。

この質問をする別の方法はuserdata、クロージャーベースの OOP を使用しているときにインスタンス間でメタテーブルを共有する方法はありますか? スクリプト側から lua の構文を使用すると、私はそれが可能だとは思いませんが、C 側で何かできることを望んでいます。


更新(2013-10-10):使用する @lhf の回答lua_setuservalue()lua_getuservalue()、メタテーブルを再利用できるように解決したプロトコルに基づいて、次のようになります。

  1. を使用して単一のメタテーブル オブジェクトを登録しますluaL_newmetatable()userdataメタテーブルの登録時に上位値が使用されないため、このメタテーブルはインスタンス間で共有できるようになりました。
  2. 値を作成しuserdataます ( lua_newuserdata())。
  3. 正しいメタテーブルをuserdata値に割り当てます ( lua_setmetatable())。
  4. インスタンス メソッド呼び出し/属性テーブルを作成し、1 つの上位値であるuserdata.
  5. lua_setuservalue()onを使用しuserdataて、インスタンスごとの属性/メソッド テーブルへの参照を格納します。
  6. の uservalue テーブル__indexを使用するように、さまざまなメタメソッド ( など) を変更します。userdata

結果として:

  • 上位値はメタメソッドでは使用されません
  • upvalues は、値のインスタンス メソッドでのみ使用されます
  • 特定のクラスのインスタンスごとに 1 つの追加テーブルしかありません

ユーザーデータごとにメソッド/属性テーブルの作成を回避することはまだ不可能ですが、そのオーバーヘッドはわずかです。を使用せずに何らかの形でobj.myMethod()渡せばいいのですが、これは別の方法では不可能なためです (upvalue を使用しない限り)。objfunction myMethod()::

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

c - Lua C API - プロパティを関数にマッピングする

関数をLuaのプロパティとしてプッシュすることは可能ですか?

現在、次のようにフィールドとしてプッシュすることで、Get/Set 関数を使用できます。

そして、Lua で次のように呼び出します。

メタテーブルなしで C 関数にマップされたプロパティをプッシュすることは可能ですか? カスタム関数にメタテーブルでマッピングできましたが、もっと簡単な方法があるかどうか疑問に思っていまし__indexた。__newindex最終的に、メタテーブルのない次の構文が必要です。

これは と なし__indexで可能__newindexですか?

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

lua - lua インタープリター、完全な機能のためにファイルを 2 回インポートする必要がある

だから私はこれに似たluaファイルを持っています:

インタープリターに次のように入力します。

この方法は、ファイルを 2 回目にインポートしたときに機能しますが、最初のインポートでは機能しません。どうしてこれなの?順序を変更してみましたが(コンストラクター関数を最後に配置)、同じでした。

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

lua - Lua - メタテーブルで演算子を 1 つだけ呼び出す

私はLuaが初めてなので、チュートリアルで何かを見逃しているかもしれませんが、問題は次のとおりです。

元のテーブルと、それに適用するいくつかの演算子を含むメタテーブルがあります。

残念ながら、次のような操作を行っているとき:

エラーが表示されます:

この問題に関する説明は見つかりませんでした。また、メタテーブルが別の変数であり、メソッドに渡された場合、それが機能することに気付きsetmetatableました..