問題タブ [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.
oop - Lua で新しいオブジェクトにメタテーブルを指定する
方法/1
方法/2
ほとんどの場合、このself.__index = self
方法を使用している人を見てきましたが、これは不器用に思えます。Dog
メタテーブルを構成しないすべての追加メソッドを含むオブジェクト全体を に渡すのはなぜsetmetatable
ですか? メソッド/1metatable.__index
は、新しいオブジェクトをオブジェクトに設定するのに適していDog
ます。また、クリーンでもあります。
Method/1の代わりにMethod/2を使用する正当な理由はありますか?
コンテキストを提供するためのいくつかの追加コード。両方の方法で動作します
arrays - Luaでテーブルからデータを取得する方法
私はテーブルを持っています:
テーブルのキーと値を取得するにはどうすればよいですか?
私は次のように取得しようとしました:
しかし、うまくいきません。
lua - lua で # 演算子を変更
関係のない love2d エンジンで lua コンソールを作成しました。メタテーブルをアップグレードして、より多くのことを実行できるようにしようとしています (ペア関数、ターゲット テーブルではなく別のテーブルのメタテーブルを変更するなど)。作成中のアドオンの 1 つは__changeindex
、既存のテーブルを変更するときのイベントです。索引。
これを行うには、値を保持しないダミーテーブルをユーザーに提供する必要があります。ユーザーが何かを追加しようとすると、それが実際のテーブルで既に定義されているかどうかを確認し、それが call である場合は call __changeindex
、そうでない場合は call __newindex
. これは完全に機能しますが、他の多くの Lua テーブル関数が機能しなくなります (for loops/getmetatable/setmetatable)。これらの問題のほとんどに対して回避策を作成しましたが、正常に機能しますが、#t 演算子を機能させることができません。
そして #t2 は本当に #t1 を返すはずです。これを行う方法はありますか?
このための私の既存のコードはここにあります
編集:これは私の最初の投稿なので、投稿ルールに完全に従わなかった場合はお詫びします。試してみました:)また、誰かが偽のテーブルと実際のテーブルのガベージコレクションを作成する方法を持っている場合は、本当に感謝しています
lua - 文字列の Lua オーバーライド #
Lua で文字列の独自の長さメソッドを実装しようとしています。文字列の len() メソッドのオーバーライドに成功しましたが、# 演算子に対してこれを行う方法がわかりません。
私が電話した場合:
以下を出力します。
しかし
「3」のみを出力します。これは、私の代わりに元の長さ関数を呼び出したことを意味します。# の長さ関数を呼び出す方法はありますか?
lua - アクセス時のLuaのメタテーブルの時間の複雑さ
アクセスの時間計算量はins.base
?
lua - Lua メタテーブルで「メソッド」とインデックス演算子の両方を指定する
メソッドとインデックス演算子 (整数インデックスを使用) の両方をサポートするには、ユーザーデータ オブジェクトが必要です。関数を介してメソッドをシミュレートせずに、共通のメタテーブルでこれを達成する方法はありますか?
metatable(object).__index
実際のメソッドを含むテーブルとmetatable(metatable(object).__index).__index
、インデックス演算子を実装する関数に設定することにより、メタテーブルをチェーンしてみました。ただし、その関数は__index
、元のオブジェクトではなく、最初のテーブルを引数として呼び出されます。メタメソッドが関数の場合、元のオブジェクトを渡す方がはるかに理にかなっているから__index
です。とにかく、__index
関数内のメソッド名を明示的にチェックせずに、私が望むものを達成する方法はありますか?
lua - Lua メタテーブル: クラス フィールドとインスタンス フィールド
私はコロナ/ルアでゲームに取り組んでおり、ゲーム内の武器、鎧、お守りなどを表す「アイテム」と呼ばれるクラスを実装しています。オブジェクト指向のルアは初めてです。
クラスの新しいインスタンスを作成した後、オブジェクトの特定のプロパティを設定すると、オブジェクト自体ではなく、クラスのメタテーブルに設定されているように見えることがわかりました。
クラスとコンストラクタは次のとおりです。
ここで、このプロトタイプに基づいて 2 つのオブジェクトを作成するとします。
残念なことに、「bonuses.damageBonus」プロパティがメタテーブル内で設定され、すべてのアイテムに適用されているようです (つまり、弓もダメージ ボーナスを受け取り、リングとスタックします)。ただし、動作は「ボーナス」プロパティに限定されているようです。「itemType」プロパティを設定すると、予想どおり、クラスではなくオブジェクトに関連付けられます。
私が見たい動作は、「ボーナス」テーブルのフィールドを個々のアイテムに設定できることです。私が間違っていることは何か分かりますか?ありがとう!
lua - lua __pairs の実際の実装は何ですか?
lua 5.2の実際の実装を知っている人はいますか。メタメソッド__pairs
? つまり、メタテーブルでメタメソッドとして実装__pairs
して、まったく同じように動作させるにはどうすればよいpairs()
ですか?
オーバーライドする必要があり__pairs
、テーブルに追加するいくつかのダミー変数をスキップしたいと考えています。
lua - Lua:未定義変数を名前で解釈する
特定の状況下で nil 値を取得できる関数foo
があります。つまりfoo(VarA)
whileVarA
は未定義です。この未定義VarA
は解釈されるはずですが、オプション パラメータとして機能する必要があるため、"VarA"
呼び出すことができません(通常の文字列パラメータとは異なります)。foo("VarA")
VarA
これで目的の結果が得られますが、他のすべての未定義変数はその名前を返します。のようにabc -> "abc"
。この特定のケースでメタテーブルのみをアクティブにする方法はありますか? foo
メソッドでメタテーブルを切り替えることができましたが、foo
ブロックにいるとき、渡されたパラメーターはすでに nil であり、遅すぎます。
付録: 質問が具体的ではなかったと思います。パラメータをテーブルとして渡すScholliiの答えは良かったが、意図したとおりに機能しない:
これには、キー情報 (オプション 1 とオプション 2) と値の情報が含まれている必要があります (削除とプッシュがグローバルまたはローカル名前空間に存在しない場合でも)。Schollii のアプローチでは、重要な情報は得られますが、値の情報 (「削除」や「プッシュ」など) は得られません。これらの新しい「キーワード」は後で関数自体によって定義される必要があるため、削除とプッシュを事前に定義することはできません。これらの新しいキーワードを文字列として渡すことはできません。