元表和元表?

我正在尝试在我的表中制作一个__index函数,它可以处理它接收到的所有字段。我想要做的是,如果我以以下方式调用表格

mytable.str1.str2.str3

我应该能够返回表格

{"str1", "str2", "str3"}

请注意,str1、str2和str3未定义,它们只是字符串。我不是在尝试创建子表str1、str2,我只想让__index查看第一个句点之后的所有内容。

不幸的是,我所拥有的似乎只捕获到str1,并抱怨“尝试对字段'str1'进行索引(空值)”

有人知道如何做到这一点吗?

原文链接 https://stackoverflow.com/questions/7164316

点赞
stackoverflow用户734069
stackoverflow用户734069

它无法这样做。这要求每个表都有一个元表。

mytable 是一个表。str1 是一个_不同的_ 表。你可以通过这个方式完成相同的事情:

local temp = mytable.str1
temp.str2.str3

对于 Lua 来说,这些是等价的。因此,了解每个阶段所做的事情的唯一方法是给它们所有一个特殊的元表。如何将不同的值连接成一个表是您需要自行研究的。

2011-08-23 17:22:46
stackoverflow用户221509
stackoverflow用户221509

正如 Nicol 所说,你不能直接在 Lua 中做到这一点。然而,通过返回精心制作的表格,你可以实现类似于你想要的结果。参考 Lua-users Wiki 上的 AutomagicTables 获得灵感。

2011-08-23 17:34:40
stackoverflow用户63791
stackoverflow用户63791

我不确定你为什么要这样做,但是下面是如何实现的。注释解释了这个技巧,但基本上你需要一个第二个元表来处理从第一次调用__index元方法返回的表。

如果这不清楚,请让我知道,我可以详细解释一下。

-- 这个元表将新的键附加到自身,然后返回自身
stringtablemeta = {}
function stringtablemeta.__index(self, key)
    table.insert(self, key)
    return self
end

-- 对评论中的问题的回答:
function stringtablemeta.__tostring(self)
    local str = ""
    for i, v in ipairs(self) do
        if i > 1 then str = str .. "-" end
        str = str .. v
    end
    return str
end

-- 这个元表创建一个新表,并将 stringtablemeta 作为其元表
mytablemeta = {}
function mytablemeta.__index(self, key)
    local temp = { key }
    setmetatable(temp, stringtablemeta)
    return temp
end

-- 将 mymetatable 作为 mytable 的元表。这将使其在对其进行索引时,
-- 调用 mytablemeta.__index 方法。
--
-- 它将返回一个具有单个字符串 key 的 talb。该表将有自己的元表 stringmetatable,
-- 导致其通过自身的 __index 元方法附加调用它的键。
mytable = {}
setmetatable(mytable, mytablemeta)

test = mytable.str1.str2.str3

for k, v in pairs(test) do
    print(k, v)
end
2011-08-26 06:01:28