2012-02-01 54 views
4

我使用Lua作为我的C++应用程序的数据描述语言。我有一堆使用SLB 2.0绑定到Lua的C++类。我有方法绑定,如'SetPos'或'SetName'。我使用键值为'pos'或'name'的表格指定位置或名称(例如)。我希望能够取得关键字,并预先设置'set',并调用该方法(如果存在的话)。那可能吗?如果是这样,有什么建议?Can Lua是否支持不区分大小写的方法调用?

我知道我可以使我的绑定方法小写,但我宁愿让他们像他们绑定的方法一样(可能是我的备用尽管)。我可以尝试根据我的命名标准构建方法名称,但不区分大小写的情况不容易出错。

我感觉那里应该是一个棘手的一块Lua,可以使用metatables来解决这个问题,但我一直无法自己解决这个问题。

有什么建议吗?

谢谢!

+0

我对SLB并不熟悉。你有一张桌子上装满了与你的C++绑定的功能吗?如果你有一个充满函数的表,你当然可以做你想做的事情,因为你可以定义'__index' metatable方法来对你的表做一个不区分大小写的搜索,找到匹配的方法并返回它。那就是说,为什么你甚至需要这个?一般而言,Lua函数是区分大小写的,所以我认为保留原有功能没有问题。 – 2012-02-01 20:41:34

+2

我强烈建议在两个地方采用并坚持一致性策略,即名称完全相同(+/-“集合”前缀)。 – 2012-02-01 20:42:10

+0

我想成为一个有点松懈的原因是,如果我在案件中犯了错误,我不会知道直到运行时。显然不是一个表演的阻挡者,但它会很好。 至于为什么我想要这样做,原因是我想在我的lua文件中(例如在一个定义数组中)取一个变量(名称=“blah”),并将其映射到调用方法(myObj.SetName(“blah”))。 – 2012-02-01 23:38:16

回答

6

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

不用{}创建表,而是使用此函数调用创建表。表格应该正常工作(尽管显然会员访问会稍微慢一点)。

+0

谢谢。我决定修改SLB以为我的方法绑定创建一个小写别名。然后,我可以在我的类中使用__index查找并使用'funcName(objectInstance,methodName)'窗体调用它。 我只想要序列化数据的这个功能,所以我现在要避免修改__index&__newindex函数。 – 2012-02-01 23:44:49