无法使用 metatable 在 lua 中从基类创建实例

我目前正在开发 Defold 项目并需要在 lua 中构建一个类。 这是我的基础类

local class = {}
class.__index = class
class.value = nil
function class.create()
    local o ={}
    setmetatable(o, class)
    return o
end
function class:printOut()
    print(class.value)
end
function class:setValue(value)
    class.value = value
end
return class

这是我在主脚本中的使用

local mclass = require "main.mclass"
local B
local C

function init(self)
    msg.post(".", "acquire_input_focus")
    msg.post("@render:", "use_fixed_fit_projection", { near = -1, far = 1 })
    B = mclass.create()
    C = mclass.create()
end

function on_input(self, action_id, action)
    if action_id == hash("touch") and action.pressed then
        B:setValue(10)
        print(B.value)
        B:setValue(12)
        print(C.value)
        --print(B.value)
    end
end

我想为每个 B 和 C 创建来自基础类的实例。但似乎它们都指向同一个基础类。当我通过 B 改变值时,C 中的值也发生了改变。 我错过了什么吗?或者我的类设置有误。 谢谢大家的帮助!

点赞
用户3574628
用户3574628

在您的类文件中,class 总是指相同的表。这就是您在 printOutsetValue 中修改/访问的表。

通过使用冒号表示法,这两个函数都有一个隐含的 self 参数。使用它来代替 class (例如 print(self.value)self.value = value)。

2020-04-04 19:00:34
用户13222973
用户13222973

我改变了我的 mClass 并且它运行良好。

local class = {}
class.__index = class
function class.create()
    local o ={}
    setmetatable(o, class)
    return o
end
function class:printOut()
    print(self.value)
end
function class:setValue(value)
    self.value = value
end
return class

但我想知道我应该如何将属性放入这个类中。就像我在这个类中有许多属性一样: self.value1 self.value2 .. 我应该把这些属性放在哪里呢?

2020-04-04 19:25:20