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.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
當我把球員:get()方法在我的方法,它的返回最後一個對象聲明。
我不確定我是否完全理解這個問題,但在這些內部函數中'self'將會是'mt.math' /'mt.effect'表,而不是頂級'mt'表這並不明確。 –
有什麼方法可以打電話給mt嗎? – Synchro
如果你給你的mt表一個'__call' metamethod它可以被調用。我不確定這與你的問題有什麼關係。 –