不区分大小写并不是 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
您无需使用 {} 创建表,而是使用此函数调用创建表。该表应该正常运行(尽管显然成员访问会稍微慢一些)。