Lua能够支持大小写不敏感的方法调用吗?

我正在将Lua用作我的C++应用程序的数据描述语言。我使用SLB 2.0将一堆C++类绑定到Lua上。我已经绑定了方法,如'SetPos'或'SetName'。我使用一个包含以'pos'或'name'为键的值的表来指定位置或名称(例如)。如果它存在(可能不存在),我想能够使用键名前缀'set',并调用该方法。这可能吗?如果可以,有什么建议吗?

我知道我可以使我的绑定方法小写,但我宁愿将它们保持与绑定到它们的方法相同(那可能是我的后备计划)。我可以尝试根据我的命名标准构建方法名称,但不区分大小写的方式更少出错。

我觉得应该有一个巧妙的Lua片段可以使用元表来解决这个问题,但我自己还没有能够解决它。

有什么建议吗?

谢谢!

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

点赞
stackoverflow用户734069
stackoverflow用户734069

大小写不敏感并不是 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

你不再使用 {} 创建表,而是使用这个函数调用来创建表。该表应该像普通表一样工作(虽然显然成员访问会稍微慢一些)。

2012-02-01 20:58:34