在 cocos2dx 示例中,有这样的代码:
function UIButtonTest.extend(target)
local t = tolua.getpeer(target)
if not t then
t = {}
tolua.setpeer(target, t)
end
setmetatable(t, UIButtonTest)
return target
end
setpper 和 getpeer 有什么用?
这些是 tolua 函数。tolua 手册(例如这里)对它们进行了解释。
tolua.setpeer (object, peer_table) (lua 5.1 only)
将表设置为对象的对等表(可以为 nil)。对等表是存储对象的所有自定义 lua 字段的地方。当使用 lua 5.1 编译时,tolua++ 将 peer 存储为对象的环境表,并使用 uses
lua_gettable/settable
(而不是lua_rawget/set
lua 5.0)在其上检索和存储字段。这允许我们在我们的表上实现我们自己的对象系统(使用metatables
),并将其用作从 userdata 对象继承的一种方式。考虑前面示例的替代方案:
-- a 'LuaWidget' class
LuaWidget = {}
LuaWidget.__index = LuaWidget
function LuaWidget:add_button(caption)
-- add a button to our widget here. 'self' will be the userdata Widget
end
local w = Widget()
local t = {}
setmetatable(t, LuaWidget) -- make 't' an instance of LuaWidget
tolua.setpeer(w, t) -- make 't' the peer table of 'w'
set_parent(w) -- we use 'w' as the object now
w:show() -- a method from 'Widget'
w:add_button("Quit") -- a method from LuaWidget (but we still use 'w' to call it)
在索引我们的对象时,将首先查询对等表(如果存在),因此我们不需要实现自己的 __index 元方法来调用 C++ 函数。
tolua.getpeer (object) (lua 5.1 only)
从对象中检索对等表(可以为 nil)。