-3

在 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 有什么用?

4

1 回答 1

2

这些是 tolua 函数。tolua 手册(例如这里)对它们进行了解释。

tolua.setpeer (object, peer_table) (lua 5.1 only)

将表设置为对象的对等表(可以为 nil)。对等表是存储对象的所有自定义 lua 字段的地方。当使用 lua 5.1 编译时,tolua++ 将 peer 存储为对象的环境表,并使用 uses lua_gettable/settable(而不是lua_rawget/setlua 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)。

于 2014-04-02T13:25:42.510 回答