Lua - 获取嵌套 metatable __index 方法的原始表地址

我有这段 Lua 代码

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) --输出A的地址
print("B")
print(B)  --输出B的地址
print("mt2")
print(mt2)  --输出mt2的地址
print("mt1")
print(mt1) --输出mt1的地址
print("___________")

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

mt1 中的方法 __index (在变量 t 中)我有 mt2 表的地址。是否可能在那里获取原始调用的表 AB 的地址?

点赞
用户6834680
用户6834680
local mt1 = {
   __index = function (t, k)
      return "key doesn't exist in table "..t.name
   end
}

local mt2 = {
   x = 15
}

-- setmetatable(mt2, mt1)  -- 我们不再需要这一行

function mt2.__index(t, k)
   local v = rawget(mt2, k)
   if v ~= nil then
      return v
   else  -- 手动传递原始的表,而非使用嵌套元表
      return mt1.__index(t, k)
   end
end

local A = setmetatable({ a = 10, name = 'A'}, mt2) -- A表关联mt2元表
local B = setmetatable({ b = 10, name = 'B'}, mt2) -- 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
2016-11-02 09:09:23