gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:28:59 28 4
gpt4 key购买 nike

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

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

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

有什么建议吗?

谢谢!

最佳答案

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

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

关于lua - Lua可以支持不区分大小写的方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102931/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com