在lua中嵌套元表

在lua中嵌套元表,lua,Lua,在下面的代码中,我试图在_索引上嵌套元表,但它不起作用。我想做的是,如果值是t1或t2,那么返回相关的值,否则调用最里面的_索引上的函数。这可能吗 因此,在下面的x[“hello”]中,我可以返回一个值。我知道我可以在最外层的索引上使用一个函数,但似乎我应该能够使用嵌套的元表来实现这一点 蒂亚 这是可行的,但似乎我可以用元表来实现 x = { val = 3 } -- our object mt1 = { t1 = 2, t2 = 3 } m

在下面的代码中,我试图在_索引上嵌套元表,但它不起作用。我想做的是,如果值是t1或t2,那么返回相关的值,否则调用最里面的_索引上的函数。这可能吗

因此,在下面的x[“hello”]中,我可以返回一个值。我知道我可以在最外层的索引上使用一个函数,但似乎我应该能够使用嵌套的元表来实现这一点

蒂亚

这是可行的,但似乎我可以用元表来实现

x = { val = 3 }      -- our object

mt1 = {
        t1 = 2,
        t2 = 3
    }

mt = {
        __index = function (table, key)
            local a = mt1[key]
            if a == nil then
                print("here"..key)
                a = "test"
            end
            return a
        end
}

setmetatable(x, mt)
print(x["t1"])
print(x.t2)
print(x["hello"])

这是可行的,但我可以不声明mt2就这样做吗

x = { val = 3 }      -- our object

mt2 = {
        __index = function (table, key)
                print("here"..key)
            return key
        end
}

mt = {
        __index = {
        t1 = 2,
        t2 = 3
        }
}

setmetatable(mt.__index, mt2)
setmetatable(x, mt)
print(x["t1"])
print(x.t2)
print(x["hello"])

…对于在家中跟随的任何人来说,这里是内嵌嵌套元表的。谢谢你的提示,亚历山大,这使它更干净了

x = setmetatable(
    { val = 3 },
    {
        __index = setmetatable({
                t1 = 2,
                t2 = 3
            },
            {
            __index = function (table, key)
                print("here"..key)
                return key
            end
            }
        )
    }
)
print(x["t1"])
print(x.t2)
print(x["hello"])
只需嵌套
setmetatable()
调用-它返回第一个参数。另外:你在这里创建了很多全局变量,
local
是你的朋友。
x = setmetatable(
    { val = 3 },
    {
        __index = setmetatable({
                t1 = 2,
                t2 = 3
            },
            {
            __index = function (table, key)
                print("here"..key)
                return key
            end
            }
        )
    }
)
print(x["t1"])
print(x.t2)
print(x["hello"])