問題タブ [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.
string - Lua にベアワードを追加する
lua 内でドメイン固有言語を実装するために、言語にベアワードを追加したいと考えています。したがって、それ
print("foo")
は次のように書くことができますprint(foo)
私がこれを行った方法は、環境テーブルのメタテーブルを変更すること_G
です。
変数の値を取得するにfoo
は_G.foo
、_G["foo"]
これは良いアプローチですか?隠れた欠点はありますか?より良い方法はありますか?ベアワードが特定のファイル内でのみ機能するようにすることはできますか? (おそらく、別の luascript から を使用してそのファイルを実行することによってloadstring
)
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.
c++ - Lua C API - スタック上のテーブルからメタテーブルを取得する
関数に渡されたテーブルがあり、次のようにスタックの一番上にあるとしましょう。
スタック上のそのテーブルからメタテーブルを取得することは可能ですか? 次のように、既知の名前の識別子を使用して簡単に取得できます。
しかし、関数を再利用して、スタック内のテーブルからメタテーブルを取得したいと考えています。
おそらくこれを行う簡単な方法がありますが、これを行う関数が見つからないようです。
c++ - luaでは、関数の代わりにユーザーデータ値にupvalueをバインドする方法はありますか?
次の例でuserdata
は、型の値が作成され、を呼び出すMyType
メタ関数でテーブルが作成されます。このコードは、クロージャ ベースの lua OOP を作成します。提供された例に対する私の不満は、upvalues を介してメソッド呼び出しに関連付ける方法が 1 つしかないように見えることです。インスタンス間で同じメタテーブルを共有したい場合を除き、それ自体は問題ありません。__tostring
LI_MyType__tostring
userdata
理想的な世界では、そして私がこの質問で明らかにしたいと思っていることですが、upvalue をuserdata
介して関数呼び出しに関連付けずに、upvalue を値 (たとえば ) に関連付ける方法はありますか? クロージャーベースの lua OOPを引き続き使用し、インスタンス間で同じメタテーブルを共有できるトリックがあることを願っています。私は楽観的ではありませんが、誰かに提案や自明ではないトリックがあるかどうかを尋ねたいと思いました。
次のようなことを実行する方法があることを願っています (これは疑似コードです!):
これは、OOP の「通常の」メタテーブル スタイルの場合と似ていることはわかっていますが、クロージャ ベースを維持し、コロン構文の導入を避けたいと考えています。
この質問をする別の方法はuserdata
、クロージャーベースの OOP を使用しているときにインスタンス間でメタテーブルを共有する方法はありますか? スクリプト側から lua の構文を使用すると、私はそれが可能だとは思いませんが、C 側で何かできることを望んでいます。
更新(2013-10-10):使用する @lhf の回答lua_setuservalue()
とlua_getuservalue()
、メタテーブルを再利用できるように解決したプロトコルに基づいて、次のようになります。
- を使用して単一のメタテーブル オブジェクトを登録します
luaL_newmetatable()
。userdata
メタテーブルの登録時に上位値が使用されないため、このメタテーブルはインスタンス間で共有できるようになりました。 - 値を作成し
userdata
ます (lua_newuserdata()
)。 - 正しいメタテーブルを
userdata
値に割り当てます (lua_setmetatable()
)。 - インスタンス メソッド呼び出し/属性テーブルを作成し、1 つの上位値である
userdata
. lua_setuservalue()
onを使用しuserdata
て、インスタンスごとの属性/メソッド テーブルへの参照を格納します。- の uservalue テーブル
__index
を使用するように、さまざまなメタメソッド ( など) を変更します。userdata
結果として:
- 上位値はメタメソッドでは使用されません
- upvalues は、値のインスタンス メソッドでのみ使用されます
- 特定のクラスのインスタンスごとに 1 つの追加テーブルしかありません
ユーザーデータごとにメソッド/属性テーブルの作成を回避することはまだ不可能ですが、そのオーバーヘッドはわずかです。を使用せずに何らかの形でobj.myMethod()
渡せばいいのですが、これは別の方法では不可能なためです (upvalue を使用しない限り)。obj
function myMethod()
:
:
c - Lua C API - プロパティを関数にマッピングする
関数をLuaのプロパティとしてプッシュすることは可能ですか?
現在、次のようにフィールドとしてプッシュすることで、Get/Set 関数を使用できます。
そして、Lua で次のように呼び出します。
メタテーブルなしで C 関数にマップされたプロパティをプッシュすることは可能ですか? カスタム関数にメタテーブルでマッピングできましたが、もっと簡単な方法があるかどうか疑問に思っていまし__index
た。__newindex
最終的に、メタテーブルのない次の構文が必要です。
これは と なし__index
で可能__newindex
ですか?
lua - lua インタープリター、完全な機能のためにファイルを 2 回インポートする必要がある
だから私はこれに似たluaファイルを持っています:
インタープリターに次のように入力します。
この方法は、ファイルを 2 回目にインポートしたときに機能しますが、最初のインポートでは機能しません。どうしてこれなの?順序を変更してみましたが(コンストラクター関数を最後に配置)、同じでした。
lua - Lua - メタテーブルで演算子を 1 つだけ呼び出す
私はLuaが初めてなので、チュートリアルで何かを見逃しているかもしれませんが、問題は次のとおりです。
元のテーブルと、それに適用するいくつかの演算子を含むメタテーブルがあります。
残念ながら、次のような操作を行っているとき:
エラーが表示されます:
この問題に関する説明は見つかりませんでした。また、メタテーブルが別の変数であり、メソッドに渡された場合、それが機能することに気付きsetmetatable
ました..