Lua类保留旧值

我是Lua的新手,所以我肯定还缺少些什么,但是我有这个类,它似乎表现出人意料之外的行为。

Item = {elm = nil, __index = {}}

function Item:new(obj)
    setmetatable({}, Item)
    self.elm = obj.elm
    return self
end

function Item:collectItem()
    print(self.elm);
end

local itm = Item:new{elm = "val1"}
local itm2 = Item:new{elm = "val2"}

itm:collectItem()
itm2:collectItem()

这将输出:

>val2
>val2

当我期望:

val1 val2

我错过了什么?

点赞
用户142162
用户142162

问题在于你的Item:new函数一直修改同一个表:Item(在Item:new上下文中的self)。你想做的是为每个新的Item对象创建一个新的表。以下是一种你可以做到这一点的方法:

Item = {elm = nil}

function Item:new(obj)
    -- 创建一个新表,其元表的__index是Item表
    local instance = setmetatable({}, {
        __index = self
    })
    -- 修改新表,而不是Item(self)
    instance.elm = obj.elm
    -- 返回新对象
    return instance
end
2014-03-27 23:26:16