我有一个如此定义的类:
local MyClass = {
_VERSION = 'MyClass 1.0.0'
}
MyClass.__index = MyClass
setmetatable(MyClass, {
__call = function (cls, ...)
return cls.new(...)
end
})
function MyClass.new(prop1)
local self = setmetatable({}, MyClass)
self.prop1 = prop1
return self
end
function MyClass:msg(txt)
self.prop1 = txt
print(self.prop1)
end
function MyClass:callFunc(func, ...)
pcall(func, ...)
end
我的客户端代码可能如下所示:
local inst = MyClass("value 1")
inst:msg("Hello world")
inst:callFunc(inst:msg, "Hello again")
当我运行此客户端代码时,收到错误消息
预期在','
附近的函数参数
代码是完全可重新编程的。您可以轻松查看here。只需复制粘贴并运行它,您将收到此错误消息。我该如何解决?
答案 0 :(得分:7)
问题在于inst:msg
中使用inst:callFunc(inst:msg, "Hello again")
。 :
语法只是一个"调用"约定(这就是为什么它需要函数参数),因此不能用于引用方法。您只需将其替换为inst.msg
或MyClass.msg
,即可获得与预期相同的效果,而不会触发错误。
答案 1 :(得分:0)
我有一个有效的解决方案。我偶然得到了它。这是:
local MyClass = {
_VERSION = 'MyClass 1.0.0'
}
MyClass.__index = MyClass
setmetatable(MyClass, {
__call = function (cls, ...)
return cls.new(...)
end
})
function MyClass.new(prop1)
local self = setmetatable({}, MyClass)
self.prop1 = prop1
return self
end
function MyClass:msg(txt)
if txt == nil then
print(self.prop1)
else
self.prop1 = txt
print("Two")
end
end
function MyClass:callFunc(func, ...)
pcall(func, ...)
end
-- client code
local inst = MyClass("value 1")
inst:callFunc(MyClass.msg, inst)
因此,主要思想是将带有点表示法的函数作为第一个参数传递,并将类实例作为第二个参数传递。希望它会帮助别人。