不区分大小写不是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并不熟悉。你有一张桌子上装满了与你的C++绑定的功能吗?如果你有一个充满函数的表,你当然可以做你想做的事情,因为你可以定义'__index' metatable方法来对你的表做一个不区分大小写的搜索,找到匹配的方法并返回它。那就是说,为什么你甚至需要这个?一般而言,Lua函数是区分大小写的,所以我认为保留原有功能没有问题。 – 2012-02-01 20:41:34
我强烈建议在两个地方采用并坚持一致性策略,即名称完全相同(+/-“集合”前缀)。 – 2012-02-01 20:42:10
我想成为一个有点松懈的原因是,如果我在案件中犯了错误,我不会知道直到运行时。显然不是一个表演的阻挡者,但它会很好。 至于为什么我想要这样做,原因是我想在我的lua文件中(例如在一个定义数组中)取一个变量(名称=“blah”),并将其映射到调用方法(myObj.SetName(“blah”))。 – 2012-02-01 23:38:16