Значение слова getpeer & setpeer

В примере 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?

1 ответ

Решение

Это функции Толуа. Руководство толуа ( например, здесь) имеет объяснения для них.

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

Устанавливает таблицу как таблицу пиров объекта (может быть ноль). В одноранговой таблице хранятся все пользовательские поля lua для объекта. При компиляции с lua 5.1 tolua ++ сохраняет одноранговый узел как таблицу окружения объекта и использует 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)

Извлекает одноранговую таблицу из объекта (может быть нулем).

Другие вопросы по тегам