Lua表的替代值(整体)

时间:2018-07-27 02:11:24

标签: lua

我相信对此的答案是“否”,但是我仍然要问:

我有几个值的嵌套表,大多数表具有相同的〜“ schema”(名称的层次结构)。例如,theme.person.child在每个嵌套表中都有一个值,例如像"#ffcc33"这样的字符串。

有时候,我希望能够引用theme.person(通常是一个表)并“获取”字符串值而不是名称。我想要所有person的默认值,而不管子键如何。

是否有任何元方法/键可以让我在table.person.childtable.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

1 个答案:

答案 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

codepad

如果有要使用的标准,则可以使用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

codepad