我有以下课程
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
而不调用它,该函数将被调用
而且我有一种感觉,我试图使事情复杂化,而解决方案则简单得多。
任何帮助表示赞赏。
更新
@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.__group)作为 self 而不是 progress_object 传递。
希望这是有道理的。