【问题标题】:function arguments expected near ','',' 附近应有函数参数
【发布时间】:2017-11-20 23:47:50
【问题描述】:

我有一个这样定义的类:

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。只需复制粘贴并运行它,您将收到此错误消息。我该如何解决?

【问题讨论】:

  • 它指向哪一行?
  • 它指向我调用callFunc 的最后一行。顺便说一句,我自己解决了我的问题。我会在一分钟内发布解决方案

标签: unit-testing lua


【解决方案1】:

问题在于在inst:callFunc(inst:msg, "Hello again") 中使用inst:msg: 语法只是一个“调用”约定(这就是为什么它需要一个函数参数),所以不能用来引用一个方法。您可以简单地将其替换为inst.msgMyClass.msg 并获得您期望的相同效果而不会触发错误。

【讨论】:

  • 我欠你这么多时间。
【解决方案2】:

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

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)

因此,主要思想是将带有点符号的函数作为第一个参数传递,并将类实例作为第二个参数传递。希望它会对某人有所帮助。

【讨论】:

  • 如果您能解释一下您真正想要实现的目标,那将会有所帮助。然后人们可以向您展示如何正确地做到这一点。这比发布问题然后意外找到答案要好。在您的问题中,您尝试打印“再次打招呼”,而在您的回答中,您做了完全不同的事情。我怀疑这会对任何人都有帮助
  • 整个问题是如何将实例(而非类)方法传递给函数调用。 instance:method 不正确,instance.methodClass.method 不完全正确,因为在这种情况下您将无法访问实例属性。秘诀是传递实例本身。我在 Lua 教程中从未见过这种情况。
猜你喜欢
  • 2015-02-18
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多