2014-03-27 123 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