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)
Могу ли я как-то правильно проверить, действительно ли я является субъектом/если функция была запущена двоеточием? Это нельзя узнать из argCount, и я не могу написать obj в функции напрямую, потому что он будет создан, и на функцию ссылаются из-за пределов области, в которой я ее определяю. Моя единственная идея - проверить, есть ли у себя член "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:
-использующего объекта, чтобы использовать методы.
вместо этого, или, может быть, вы могли бы просто добавить флаг, чтобы указать вашей функции обработки, следует ли ей использовать методы:
или.
? - person hugomg   schedule 19.05.2013