obj = {}
function obj:setName(name)
print("obj: ", self)
print("name: ", obj)
end
Създавам обект и присвоявам метод като по-горе. Сега го наричам така:
obj:setName("blabla")
Тогава самоидентификаторът се отнася до obj. Проблемът ми е, че функцията може потенциално да бъде достъпна и чрез
obj.setName("blabla")
В този случай obj няма да бъде подаден като аргумент и "blabla" ще заеме мястото на параметъра self вместо да обслужва името. Това е така, защото операторът : в декларацията на функцията е само съкратен/захарен синтаксис за
function obj.setName(self, name)
Мога ли по някакъв начин правилно да проверя дали self наистина е обектът/дали функцията е била изпълнена от двоеточие? Не може да се каже от argCount, нито мога да напиша obj във функцията директно, защото тя ще бъде създадена и функцията се препраща извън обхвата, където я дефинирам. Единствената ми идея е да проверя дали self притежава член "setName"
function obj:setName(name)
if ((type(self) ~= "table") or (self.setName == nil)) then
print("no subject passed")
return
end
print("obj: ", self)
print("name: ", obj)
end
но и това не е чисто.
редактиране: Правя го така сега:
local function checkMethodCaller()
local caller = debug.getinfo(2)
local selfVar, self = debug.getlocal(2, 1)
assert(self[caller.name] == caller.func, [[try to call function ]]..caller.name..[[ with invalid subject, check for correct operator (use : instead of .)]])
end
function obj:setName(name)
checkMethodCaller()
print(self, name)
end
assert(self.setName)
, за да спрете изпълнението на вашия скрипт при грешно извикване. - person Egor Skriptunoff   schedule 19.05.2013:
-using обект, за да използвате.
методи вместо това или може би можете просто да добавите флаг, за да кажете на вашата функция за обработка дали трябва да използва:
или.
методите? - person hugomg   schedule 19.05.2013