У меня есть следующий классLua метатаблицы и Метаметод - Как позвонить на другой функции-члена
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]
, если это не ноль.
Теперь я пытаюсь сделать то же самое для функций-членов. i.e Если я звоню 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
Но здесь есть 2 вещи.
- Я не смог получить аргументы исходной функции в
- событий, если я просто ДОСТУП
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.
Надеюсь, что имеет смысл.
Ах! Много смысла. Иногда я думаю слишком много: D Спасибо большое! – SatheeshJM
Эй. Исходный код имеет небольшую проблему. Обновите вопрос. Вы можете помочь с этим? Кстати, именно поэтому я разместил этот вопрос. Забыл проблему, когда я прочитал ваш ответ: P – SatheeshJM
@SatheeshJM Я обновил сообщение. – Mud