我有以下类
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
但有两件事情错在这里。
- 我无法找回原来的函数的参数
- 事件如果我刚刚接触
table[key].function
不调用它,该函数将被调用
我已经得到了我想要的东西复杂化的感觉和解决方案的方式更简单。
任何帮助表示赞赏。
UPDATE
@Mud与原始代码的问题是,作为“自我”到成员函数传递的对象是新的类的对象。 没有旧阶级。
考虑以下代码
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 .__基)作为自代替progress_object。
希望是有道理的。