私は次のクラスを持っています
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]
ルックアップを実行し、nilでない場合はを返します。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
しかし、ここには2つの問題があります。
- 元の関数の引数を取得できません
- イベント
table[key].function
を呼び出さずにアクセスするだけで、関数が呼び出されます
そして、私は物事を複雑にしようとしていると感じており、解決策ははるかに簡単です。
どんな助けでも大歓迎です。
アップデート
@Mud元のコードの問題は、メンバー関数に「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
上記のコードで、When progress_object:showSum(3,3)
が呼び出されると、progress_objectの代わりにgroup_object(つまりprogress_object .__ group)をselfとして渡すことができますか。
それが理にかなっていることを願っています。