【问题标题】:Can Lua support case-insensitive method calls?Lua 可以支持不区分大小写的方法调用吗?
【发布时间】:2012-02-02 05:11:51
【问题描述】:

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

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

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

有什么建议吗?

谢谢!

【问题讨论】:

  • 我对 SLB 不熟悉。您是否有一张表,其中包含以某种方式绑定到您的 C++ 的函数?如果你有一个充满函数的表,当然可以做你想做的事,因为你可以定义__index metatable 方法来对你的表进行不区分大小写的搜索以查找匹配的方法并返回它。也就是说,你为什么还需要这个? Lua 函数通常是区分大小写的,所以我认为让你的函数保持原样没有问题。
  • 我会强烈建议采用并遵守两个地方的名称完全相同(+/- set 前缀)的一致性政策。
  • 我想对案例有点松懈的原因是,如果我在案例中犯了错误,我不会知道直到运行时。显然不是一个表演停止者,但它会很好。至于为什么我首先要这样做,原因是我想在我的 lua 文件中(例如在定义数组中)获取一个变量(name = "blah"),并将其映射到一个调用到一个方法(myObj.SetName("blah"))。

标签: lua metatable


【解决方案1】:

不区分大小写并不是 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

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

【讨论】:

  • 谢谢。我决定修改 SLB 为我的方法绑定创建一个小写的别名。然后我可以在我的类中使用 __index 来查找它,并使用 'funcName(objectInstance, methodName)' 形式调用它。我只想要这个功能来序列化数据,所以我暂时避免修改 __index 和 __newindex 函数。
  • 置换示例很好,但是应该注意它根本不实用,并且地球上没有程序员被认可认真实现它。如果您正在编写必须适应程序员而不是快速高效地适应用户的软件,那么这绝对是错误的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2015-01-05
相关资源
最近更新 更多