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,因为它将被实例化,并且该函数是从我定义它的范围之外引用的。我唯一的想法是检查自己是否拥有成员“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