問題タブ [meta-method]

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 に答える
477 参照

methods - 引数を直接変更できるmake luaメソッド

string.gsub(...)luaのようなメソッドを作成するには?

関数に渡す引数を関数で変更できるようにしたい。

文字列型変数と数値型変数が関数内で名前 ( CALL BY VALUE ) で渡されることは知っていますが、

s:gsub(...)しかし、変数の変更とメソッドsの影響のように使用しようとすると、gsubがどのように変更されるか(文字列型の変数に直接適用される)はわかりません。gsub(...)

ex ( number var ) Increment by 1 !!! のInc(...)ように使用するメソッドを作成したいと思います!!!ex:Inc()

これを実装するのを手伝ってください...ex変数(例:ex = 1)を数値(テーブルではない)にしたい

ありがとうございました 。

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

lua - Lua - コルーチンのライブラリ指定

Lua スクリプト内に、同じ「構造」を使用する複数のライブラリがあります。たとえば、 と を含む a.lua がrequire('b')ありrequire('c')ます。b.lua と c.lua の両方に info 関数があります。b.lua は "b" を出力させ、c.lua は "c" を出力させます。a.lua では、B.lua または C.lua の info() でコルーチンを開始したいと考えています。

これは私の b.lua です:

C.lua も同様の構造ですが、ほとんどの B は C に置き換えられています。コルーチンを開始しようとするとlocal co = coroutine.create(b.info())(通常は一時停止が開始されるため、これも奇妙です)、「メタメソッド/C 呼び出しの境界を越えて譲歩しようとしています」のようなエラーが表示されます"。

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

lua - lua で # 演算子を変更

関係のない love2d エンジンで lua コンソールを作成しました。メタテーブルをアップグレードして、より多くのことを実行できるようにしようとしています (ペア関数、ターゲット テーブルではなく別のテーブルのメタテーブルを変更するなど)。作成中のアドオンの 1 つは__changeindex、既存のテーブルを変更するときのイベントです。索引。

これを行うには、値を保持しないダミーテーブルをユーザーに提供する必要があります。ユーザーが何かを追加しようとすると、それが実際のテーブルで既に定義されているかどうかを確認し、それが call である場合は call __changeindex、そうでない場合は call __newindex. これは完全に機能しますが、他の多くの Lua テーブル関数が機能しなくなります (for loops/getmetatable/setmetatable)。これらの問題のほとんどに対して回避策を作成しましたが、正常に機能しますが、#t 演算子を機能させることができません。

そして #t2 は本当に #t1 を返すはずです。これを行う方法はありますか?

このための私の既存のコードはここにあります

編集:これは私の最初の投稿なので、投稿ルールに完全に従わなかった場合はお詫びします。試してみました:)また、誰かが偽のテーブルと実際のテーブルのガベージコレクションを作成する方法を持っている場合は、本当に感謝しています

0 投票する
0 に答える
407 参照

c++ - Lua __index メタメソッドが C++ からバインドされていない

オブジェクト指向をやめた Lua でエレクトロニクス プロジェクト用のソフトウェア ライブラリを開発しています。私のオブジェクトには、ゲッターとセッターを持つプロパティがあり、それぞれ __index と __newindex メタメソッドで実装されています。問題は、__index メタメソッドが機能しないのに対し、__newindex メタメソッドは正常に機能することです。私のバインディングコード:

この Lua スクリプトを実行すると、次のようになります。

次の出力が得られます。

つまり、__index メタメソッドはテーブルであるため、C++ からバインドされていません。バインディング コードで何が間違っていますか?

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

lua - 文字列の Lua オーバーライド #

Lua で文字列の独自の長さメソッドを実装しようとしています。文字列の len() メソッドのオーバーライドに成功しましたが、# 演算子に対してこれを行う方法がわかりません。

私が電話した場合:

以下を出力します。

しかし

「3」のみを出力します。これは、私の代わりに元の長さ関数を呼び出したことを意味します。# の長さ関数を呼び出す方法はありますか?

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

inheritance - __index が子クラスのオブジェクトによって呼び出された場合、継承されたテーブル メンバーを子クラスに格納します

私の目標は、本格的な多重継承を備えたクラスを作成する標準的な方法と、他のクラスへの継承だけでなく、new()コンストラクターを介したそれら自身のインスタンスへの継承も可能にすることです。クラスまたはそのオブジェクトから欠損値を呼び出し、この値が関数である場合、オブジェクト/インスタンスではなく、後で使用するためにクラスに格納したいと考えています (同じ関数を大量に実装する場合のパフォーマンスの問題)クラスのインスタンスの量)。

現時点では、公式のチュートリアル シリーズ ( http://www.lua.org/pil/16.3.htmlcreateClass(...) )で言及されている関数と非常によく似た関数を使用して、ほぼ任意の数の親クラスから継承するクラスを作成しています。 :

新しく作成されたクラスに index-metamethod を渡します。このメソッドは、指定された欠落しているキーをすべての親で検索し、後で呼び出し元のクラスで使用できるように格納します。これは、ネストされた巨大な継承階層を検索する場合でも、目的として機能します。それでは、基本的なコンストラクターを持つ単純なクラスを紹介しましょう。

この継承とクラスの実装を次のコードで__index呼び出すと、クラスの新しいインスタンスが作成されたときにクラスの -metamethod が呼び出されないことがわかります (出力されたテーブル アドレスを比較してください) __index。オブジェクトは、この時点でそのような値/関数を持たない (親) クラスから欠落している値/関数を要求します。__indexどうやら、この記述は、私を混乱させるクラス自体の -metamethod を呼び出しません。スクリプトのどの部分からでも、クラス/テーブルの欠損値が要求された場合は常に呼び出されると想定します。

  1. __index与えられた例で-metamethod がMyClass呼び出されないのはなぜですか?
  2. そして、どうすればそれを達成できますか (コードの変更をできるだけ少なくすることによって)?

あなたの提案は大歓迎です!

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

lua - lua __pairs の実際の実装は何ですか?

lua 5.2の実際の実装を知っている人はいますか。メタメソッド__pairs? つまり、メタテーブルでメタメソッドとして実装__pairsして、まったく同じように動作させるにはどうすればよいpairs()ですか?

オーバーライドする必要があり__pairs、テーブルに追加するいくつかのダミー変数をスキップしたいと考えています。

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

lua - Lua:未定義変数を名前で解釈する

特定の状況下で nil 値を取得できる関数fooがあります。つまりfoo(VarA)whileVarAは未定義です。この未定義VarAは解釈されるはずですが、オプション パラメータとして機能する必要があるため、"VarA"呼び出すことができません(通常の文字列パラメータとは異なります)。foo("VarA")VarA

これで目的の結果が得られますが、他のすべての未定義変数はその名前を返します。のようにabc -> "abc"。この特定のケースでメタテーブルのみをアクティブにする方法はありますか? fooメソッドでメタテーブルを切り替えることができましたが、fooブロックにいるとき、渡されたパラメーターはすでに nil であり、遅すぎます。

付録: 質問が具体的ではなかったと思います。パラメータをテーブルとして渡すScholliiの答えは良かったが、意図したとおりに機能しない:

これには、キー情報 (オプション 1 とオプション 2) と値の情報が含まれている必要があります (削除とプッシュがグローバルまたはローカル名前空間に存在しない場合でも)。Schollii のアプローチでは、重要な情報は得られますが、値の情報 (「削除」や「プッシュ」など) は得られません。これらの新しい「キーワード」は後で関数自体によって定義される必要があるため、削除とプッシュを事前に定義することはできません。これらの新しいキーワードを文字列として渡すことはできません。

0 投票する
0 に答える
326 参照

lua - すべてのメタ可能なコンテンツを印刷する

私はテーブルを持っています:

そして、私は汚いが機能するコードを持っています:

その電報ボット。名前、日付、時間で農場について尋ねられると、それは問題ありません。

私の問題はelseステートメントの近くにあります。bot に農場と日付について質問したい。「At 16-6-2014, at farm "knk" will be 2 farms. At 17 - 2 agent. At 18 - 3 agent」のようなリストを返す必要があります。

シンプルな table.concat はうまくいきませんでした。

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

c++ - C++ からの Lua 関数の呼び出し

LuaJit の最新バージョンを使用していますが、使用を開始する際にサポートが必要です。私が必要としているのは、ユーザーが提供したコードを実行するためにスクリプト内でオーバーライドできる Lua 環境に公開された一連の関数を用意することです。これらの関数は、C++ 内からセット イベント中に呼び出されます。

たとえば、ユーザーが TAB キーを押すと、OnScoreboardOpen() などの lua 環境から関数が呼び出され、ユーザーが TAB キーを離すと、対応する関数 OnScoreboardClose() が呼び出されます。これらの関数はメタメソッドにアタッチできます。ゲームやGMのように。

これを実現する方法を示すチュートリアルやサンプル コードを教えてもらえますか? どうぞよろしくお願いいたします。