我相信对此的答案是“否”,但是我仍然要问:
我有几个值的嵌套表,大多数表具有相同的〜“ schema”(名称的层次结构)。例如,theme.person.child
在每个嵌套表中都有一个值,例如像"#ffcc33"
这样的字符串。
有时候,我希望能够引用theme.person
(通常是一个表)并“获取”字符串值而不是名称。我想要所有person
的默认值,而不管子键如何。
是否有任何元方法/键可以让我在table.person.child
和table.person
上调用相同的函数并始终获得字符串?在代码中:
local theme1 = { person = { child='#ffcc33', adult='#00ffff', _default='#ff0000' } }
local theme2 = { person = '#ff0000' }
for _,theme in ipairs{ theme1, theme2 } do
print(somefunction(theme))
end
有什么方法可以使两个打印语句的输出都为#ff0000'
?除了:
function somefunction(x) return type(x)=='table' and x._default or x end
答案 0 :(得分:1)
这是如何组织的,这有点奇怪,但这是您想要的吗? “人”必须是硬编码的属性,或者如果它们是表,是否要搜索_default
的所有属性?
local theme1 = { person = { child='#ffcc33', adult='#00ffff', _default='#ff0000' } }
local theme2 = { person = '#ff0000' }
function somefunction(tbl, param)
if type(tbl) == 'string' then return tbl end
return tbl._default
end
for _,theme in ipairs{theme1, theme2} do
print (somefunction(theme.person))
end
如果有要使用的标准,则可以使用metatables,但是必须在每个表上进行设置。在元表上使用__tostring
可以将表转换为字符串时返回所需的任何字符串。在下面的代码中,我在theme1
中的人上设置了元表,以便在对表执行_default
时返回tostring()
。 __index
使您可以在索引表时返回所需的任何值。在这里,它的工作方式类似于color
属性,如果person是表或其他人,则返回person._default
。
local personmt = {
__tostring = function(t)
if type(t) == 'table' and t._default ~= nil then return t._default end
return tostring(t)
end
}
local thememt = {
__index = function(t, k)
if k == 'color' then
if type(t.person) == 'table' then return t.person._default end
return t.person
end
end
}
local theme1 = { person = { child='#ffcc33', adult='#00ffff', _default='#ff0000' } }
local theme2 = { person = '#ff0000' }
setmetatable(theme1.person, personmt)
for _,theme in ipairs{ theme1, theme2 } do
setmetatable(theme, thememt)
print('theme.person (__tostring):', theme.person)
print('theme.color (__index) :', theme.color)
end