【发布时间】:2014-02-14 11:08:20
【问题描述】:
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
当我将 Player:get() 放入我的方法中时,它会返回最后一个对象声明。
【问题讨论】:
-
我不确定我是否完全理解这个问题,但这些内部函数中的
self将是mt.math/mt.effect表,而不是顶级mt表您不清楚的情况。 -
有什么方法可以调用mt吗?
-
如果你给你的 mt 表一个
__call元方法,它可以被调用。不过,我不确定这与您的问题有什么关系。