2016-11-01 2 views
2

から元のテーブルアドレスを取得私はmt2テーブルのアドレスを有する(可変tで)このLuaのコード方法__index内部mt1Luaは - ネストメタテーブル__index方法

local mt1 = { 
    __index = function (t, k) 
     return "key doesn't exist" 
    end 
} 

local mt2 = { 
    x = 15  
} 

setmetatable(mt2, mt1) 
mt2.__index = mt2 

local A = setmetatable({ a = 10}, mt2) 
local B = setmetatable({ b = 10}, mt2) 

print("A") 
print(A) --prints address of A 
print("B") 
print(B) --prints address of B 
print("mt2") 
print(mt2) --prints address of mt2 
print("mt1") 
print(mt1) --prints address of mt1 
print("___________") 

print(A.a) -- prints 10 
print(A.x) -- prints 15 
print(A.c) -- prints "key doesn't exist" 
print(B.b) -- prints 10 
print(A.c) -- prints "key doesn't exist" 

を有します。元の呼び出し表AまたはBのアドレスを取得できますか?

+0

@EgorSkriptunoffニース、私は 'Ax'のローカル' MT2 = {X = 15} '、それはもはやプリントを' 15'がない場合は...唯一の問題は今、..私は質問 –

+2

を編集しました@ EgorSkriptunoffパーフェクト..ありがとうございました。回答としてお寄せください –

+0

用語は "参照"ではなく "アドレス"です。アドレスは受動的なデータですが、参照は変数によって保持され、オブジェクトを到達可能としてマークするためにガベージコレクタによって使用されます。そして、いいえ、一般的に参照を取得することはできません。@EgorSkriptunoffがmt1で示すように、参照を保持する必要があります。 –

答えて

1
local mt1 = { 
    __index = function (t, k) 
     return "key doesn't exist in table "..t.name 
    end 
} 

local mt2 = { 
    x = 15 
} 

-- setmetatable(mt2, mt1) -- we don't need this line anymore 

function mt2.__index(t, k) 
    local v = rawget(mt2, k) 
    if v ~= nil then 
     return v 
    else -- pass the original table MANUALLY instead of using nested metatabling 
     return mt1.__index(t, k) 
    end 
end 

local A = setmetatable({ a = 10, name = 'A'}, mt2) 
local B = setmetatable({ b = 10, name = 'B'}, mt2) 

print(A.a) --> 10 
print(A.x) --> 15 
print(A.c) --> key doesn't exist in table A 
print(B.b) --> 10 
print(A.c) --> key doesn't exist in table A 
関連する問題