【发布时间】:2012-06-29 06:24:36
【问题描述】:
我有以下课程
local PROGRESS = {}
PROGRESS.__index = function(self,key)
if key~="__group" and self.__group[key] then
return self.__group[key]
else
return rawget(self,key)
end
end
当您访问table[key] 时,它会在table.__group(它是另一个类的对象)中执行查找并返回table.__group[key],如果它不为零。
现在我正在尝试对成员函数做同样的事情。
即如果我调用table:key(),则必须在table.__group 中执行查找,如果该函数存在,则应调用table.__group:key()。
我该如何做到这一点?
我尝试过这样做。
local PROGRESS = {}
PROGRESS.__index = function(self,key)
if key~="__group" and self.__group[key] then
local val = self.__group[key]
if type(val) == "function" then
self.__group:val()
return function() end
end
return self.__group[key]
else
return rawget(self,key)
end
end
但是这里有两件事不对。
- 我无法检索原始函数的参数
- 如果我只是 ACCESS
table[key].function而不调用它,就会调用该函数
而且我有一种感觉,我试图使事情复杂化,而解决方案要简单得多。
感谢任何帮助。
更新
@泥 原始代码的问题在于,作为“self”传递给成员函数的对象是新类的对象。不是旧班的。
考虑这段代码
GROUP_CLASS = {}
GROUP_CLASS.__index = GROUP_CLASS
function GROUP_CLASS:showSum (a,b) print(self);print(a + b) end
group_object = setmetatable({},GROUP_CLASS)
group_object:showSum(1,2)
local PROGRESS_CLASS = {}
PROGRESS_CLASS.__index = function(self,key,value)
if key~="__group" and self.__group[key] then
return self.__group[key]
else
return rawget(self,key)
end
end
progress_object = setmetatable( {__group = group_object} , PROGRESS_CLASS)
progress_object:showSum(3,3)
--progress_object is passed as first argument to showSum. But i need group_object to be passed
在上面的代码中,当progress_object:showSum(3,3)被调用时,
是否可以将 group_object(或换句话说progress_object.__group)作为self而不是progress_object传递。
希望这是有道理的。
【问题讨论】:
标签: oop class object lua metatable