我正在尝试在我的表中创建一个__index函数,它可以处理它接收到的所有字段。我想要做的是,如果我以下面的方式调用该表
mytable.str1.str2.str3我应该可以把桌子还回去。
{"str1", "str2", "str3"}请注意,str1、str2、str3是未定义的,它们只是字符串。我没有试图创建子表str1,str2,我只是想让__index看到第一个阶段之后的所有东西。
不幸的是,我所拥有的__index似乎只捕获str1,并抱怨“试图索引字段'str1‘(一个空值)”
有人知道这是怎么做的吗?
发布于 2011-08-26 14:01:28
我不知道你为什么要这样做,但这是你怎么做的。注释解释了这个技巧,但基本上您需要第二个元表来处理从第一次调用__index元方法返回的表。
如果这一点不清楚,请告诉我,我可以更详细地解释。
-- This metatable appends the new key to itself, then returns itself
stringtablemeta = {}
function stringtablemeta.__index(self, key)
table.insert(self, key)
return self
end
-- In response to the question in the comments:
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
-- This metatable creates a new table, with stringmetatable as its metatable
mytablemeta = {}
function mytablemeta.__index(self, key)
local temp = { key }
setmetatable(temp, stringtablemeta)
return temp
end
-- set mytable to have mymetatable as it's metatable. This makes it so when
-- you index into it, it will call the mytablemeta.__index method.
--
-- That will return a talb with a single string, the key that was passed
-- in. that table will have it's own metatable, the stringmetatable, which
-- will cause it to append keys that are called on it with its own __index
-- metamethod
mytable = {}
setmetatable(mytable, mytablemeta)
test = mytable.str1.str2.str3
for k, v in pairs(test) do
print(k, v)
end发布于 2011-08-24 01:22:47
它不能。不能在每个表上都有一个元表。
mytable是一个表。str1是一个不同的表。所以你可以这样做,做同样的事情:
local temp = mytable.str1
temp.str2.str3就Lua而言,它们是等价的。因此,要知道每个阶段都做了什么,唯一的方法就是给它们一个特殊的metatable。如何将不同的值连接到一个表中是您必须自己研究的问题。
发布于 2011-08-24 01:34:41
正如Nicol所说,您不能直接在Lua中做到这一点。但是,通过返回巧尽心思构建的表,您可以获得与您想要的结果相似的结果。在Lua用户维基上看一下AutomagicTables以获得灵感。
https://stackoverflow.com/questions/7164316
复制相似问题