function arguments expected near ','(函数参数在‘,’附近期望)

我定义了一个类如下:

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')

当我运行此客户端代码时,我会收到一个错误消息

function arguments expected near ','(函数参数在‘,’附近期望)

代码是可以再现的。您可以在这里轻松检查它。只需复制并粘贴并运行它,您就会收到此错误消息。我该如何解决它?

点赞
用户2544036
用户2544036

我有一个可行的解决方案。我只是偶然得到它的。这是它的代码:

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)

所以,主要思想是通过用点表示法作为第一个参数传递一个函数,并将类实例作为第二个参数传递。希望它能帮助某些人。

2017-11-20 15:07:20
用户1442917
用户1442917

问题是在使用 inst:callFunc(inst:msg, "Hello again") 中的 inst:msg:语法只是一种"调用"习惯(这就是为什么它期望在那里有一个函数参数),因此不能用来引用一个方法。你可以简单地用inst.msgMyClass.msg替换它,以获得你期望的相同效果,而不会触发错误。

2017-11-20 15:47:50