2014-03-27 87 views
3

我是Lua的新手,所以我确定我错过了一些东西,但是我有这个课程,它似乎表现得出乎意料。Lua Class保留旧值

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

缺少什么我在这里?

回答

2

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

Item = {elm = nil} 

function Item:new(obj) 
    -- Create a new table whose metatable's __index is the Item table 
    local instance = setmetatable({}, { 
     __index = self 
    }) 
    -- Modify the new table, not Item (self) 
    instance.elm = obj.elm 
    -- Return the new object 
    return instance 
end