2

__add と __sub がテーブルと数値を取るメタテーブルを作成しました。Lua はどちらを使用するかをどのように決定しますか? テーブル T (メタテーブルが記述されている) を使用して、以下の 2 つの状況を検討してください。

local n=-10
local V=T+n

local n=-10
local V=T-n

どちらが呼び出されますか?

さまざまな組み合わせを試しましたが、パターンが見当たりません。

4

2 に答える 2

5

__addと__subがテーブルと数値を取得するメタテーブルを作成しました。

__addと__subは2つのオペランドを取ります。それらの1つは、メタテーブルを持つテーブルまたはuserdataである必要があり、もう1つは何でもかまいません。Luaは他のオペランドのタイプを気にしません。

いずれかのオペランドに特定の演算子(+-> __add-=> __sub)のハンドラーを持つメタテーブルがある場合、そのハンドラーが呼び出されます。

あなたの例では、Luaは正か負かを気にしないだけでなくn、それが数値かどうかも気にしません。-inはメタメソッド-nとは何の関係もありません。これは単項マイナス演算子ですが、バイナリマイナス演算子を処理します。__sub__sub

Luaはどちらを使用するかをどのように決定しますか?

演算子は「+__add」イベントです。あなたが言ったときop1 + op2、Luaはハンドラーでメタテーブルをチェックop1__addます。見つかった場合はそれを呼び出します。それ以外の場合はチェックしますop2

于 2012-12-14T07:42:46.977 に答える
3

行列式は、ソースコード内の2つのオペランド演算子の符号です。

オペランド値が負の数であるか正の数であるかは関係ありません。nあなたが実際に数値であるか別のタイプの値であるかは関係ありません。

local n=-10  
local V=T+n  -- __add called

local n=-10
local V=T-n  -- __sub called
于 2012-12-14T06:29:21.063 に答える