Lua可以支持不区分大小写的方法调用吗?

时间:2012-02-01 20:34:58

标签: lua metatable

我正在使用Lua作为我的C ++应用程序的数据描述语言。我有一堆使用SLB 2.0绑定到Lua的C ++类。我有绑定的方法,如'SetPos'或'SetName'。我使用键值为“pos”或“name”的表来指定位置或名称(例如)。我希望能够获取密钥,前置'set',并调用方法,如果它存在(可能不存在)。那可能吗?如果有,有什么建议吗?

我知道我可以将我的绑定方法设置为小写,但我宁愿保持它们与它们所绑定的方法相同(尽管可能是我的后备)。我可以尝试根据我的命名标准构建方法名称,但不区分大小写不容易出错。

我觉得应该是一个棘手的Lua片,可以使用metatables来解决这个问题,但是我自己无法解决这个问题。

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

案例不敏感并不是Lua处理的事情。所有表查找和本地变量访问最终都是区分大小写的字符串比较。

最好的解决方案就是接受你正在处理一个区分大小写的系统,就像C ++一样,处理它。

但是,如果你真的想,你可以这样做。最简单的方法是在函数表中放置名称的每个可能的大小写排列。所以你的函数表会有这个:

["setname"] = theFunction,
["Setname"] = theFunction,
["sEtname"] = theFunction,
["SEtname"] = theFunction,
...

当然,您可以使用一个函数自动执行此操作,该函数获取表中的每个名称并根据大小写排列复制其数据。

更复杂但更易于使用的机制是使用__index__newindex元方法以及空表技巧。

function CreateCaseInsensitiveTable()
  local metatbl = {}

  function metatbl.__index(table, key)
    if(type(key) == "string") then
      key = key:lower()
    end

    return rawget(table, key)
  end

  function metatbl.__newindex(table, key, value)
    if(type(key) == "string") then
      key = key:lower()
    end

    rawset(table, key, value)
  end

  local ret = {}
  setmetatable(ret, metatbl)
  return ret
end

您可以使用此函数调用创建表,而不是使用{}创建表。否则该表应该正常运行(尽管显然成员访问会稍慢)。