Lua是否支持不区分大小写的方法调用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计554个文字,预计阅读时间需要3分钟。
我正在使用Lua作为我C应用程序的描述语言。我有一个堆使用SLB+2.0绑定到Lua的C类。我有绑定的方法,比如SetPos或SetName。我使用键值pos或name的表来指定位置或名称(例如pos或name)。
我正在使用Lua作为我的C应用程序的数据描述语言.我有一堆使用SLB 2.0绑定到Lua的C类.我有绑定的方法,如’SetPos’或’SetName’.我使用键值为“pos”或“name”的表来指定位置或名称(例如).我希望能够获取密钥,前置’set’,并调用方法,如果它存在(可能不存在).那可能吗?如果有,有什么建议吗?我知道我可以使我的绑定方法小写,但我宁愿保持它们与它们所绑定的方法相同(尽管可能是我的后备).我可以尝试根据我的命名标准构建方法名称,但不区分大小写不容易出错.
我觉得应该有一个棘手的Lua片可以使用metatables来解决这个问题,但我自己也无法解决这个问题.
有什么建议?
谢谢!
不区分大小写不是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
您可以使用此函数调用创建表,而不是使用{}创建表.否则该表应该正常运行(尽管显然成员访问会稍微慢一些).
本文共计554个文字,预计阅读时间需要3分钟。
我正在使用Lua作为我C应用程序的描述语言。我有一个堆使用SLB+2.0绑定到Lua的C类。我有绑定的方法,比如SetPos或SetName。我使用键值pos或name的表来指定位置或名称(例如pos或name)。
我正在使用Lua作为我的C应用程序的数据描述语言.我有一堆使用SLB 2.0绑定到Lua的C类.我有绑定的方法,如’SetPos’或’SetName’.我使用键值为“pos”或“name”的表来指定位置或名称(例如).我希望能够获取密钥,前置’set’,并调用方法,如果它存在(可能不存在).那可能吗?如果有,有什么建议吗?我知道我可以使我的绑定方法小写,但我宁愿保持它们与它们所绑定的方法相同(尽管可能是我的后备).我可以尝试根据我的命名标准构建方法名称,但不区分大小写不容易出错.
我觉得应该有一个棘手的Lua片可以使用metatables来解决这个问题,但我自己也无法解决这个问题.
有什么建议?
谢谢!
不区分大小写不是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
您可以使用此函数调用创建表,而不是使用{}创建表.否则该表应该正常运行(尽管显然成员访问会稍微慢一些).

