получил некоторые проблемы с metatable. Это мой простой метатаблица:Подразделение metatable
local mt = {}
function mt:add(n)
return setmetatable({n = n}, {__index = mt})
end
function mt:get() return self.n end
Теперь я хочу, чтобы добавить некоторые подразделения, как:
mt.math
mt.effect
Что каждый из них имеет некоторые собственные методы, как:
mt.math:floor() return math.floor(self:get()) end
mt.effect:show(args) onMapShowEffect(self:get(), {x = x + (args[1] ~= nil or 0), ...) end
mt.effect:get() return getCurrentPos() end
Любые идеи?
ОК, пытаясь сделать все подробности, чтобы поделиться своей проблемой.
Player = {}
function Player:add(this)
return setmetatable({this = this}, {__index = Player})
end
Player:get() return self.this end
Приведенный выше код работает отлично на этом примере
function enterToGame(player1, player2)
local p1 = Player:add(player1)
local p2 = Player:add(player2)
print(p1:get()) -- ID1
print(p2:get()) -- ID2
Теперь я хочу, чтобы создать некоторые услужливо методы (функции) для таблицы Player. Я хочу сделать его более гибким, поэтому хочу разделить его на классы. Пример:
Player.info = {
id = function() return Player:get() end,
}
Player.pos = {
get = function() return getPosition(Player:get()) end,
set = function(args) setPosition(Player:get(), args) end,
}
Player.speed = {
get = function() return getSpeed(Player:get()) end,
set = function(value) setSpeed(value) end,
improve = function(value) setSpeed(Player.speed.get() + value) end,
}
Но это не работаю именно то, что я хочу:
function enterToGame(player1, player2)
local p1 = Player:add(player1)
local p2 = Player:add(player2)
print(p1:get()) -- ID1
print(p2:get()) -- ID2
print(p1.info.id()) -- ID2 instead of ID1
print(p2.info.id()) -- ID2
Когда я помещал игрок: получить() в моих методах его возвращение заявления последнего объекта.
Я не уверен, что я точно понимаю вопрос, но 'self' в этих внутренних функциях будет представлять собой таблицы' mt.math'/'mt.effect', а не таблицу' mt' верхнего уровня в случае что вам было непонятно. –
Есть ли способ позвонить в mt? – Synchro
Если вы дадите вашей таблице mt метатет '__call', ее можно вызвать. Я не уверен, насколько это важно для вашего вопроса. –