2013-05-13 89 views
2

我在Lua有一個類。在這個構造函數中,我聲明瞭變量(在一個空的表格中)並在我想要訪問該對象的函數以便在此表格中插入對象之後。我的代碼是這樣的:來自Lua的構造函數的訪問函數

local BoxClass = require("Box") 
local SurpriseBox = {} 
local SurpriseBox_mt = { __index = SurpriseBox } -- metatable 

function SurpriseBox.new() -- constructor 
    local object = { 
    boxes = {} 
    } 
    SurpriseBox:CreateBoxes() 
    print('constructor -> ' .. #object.boxes) --> 0 
    return setmetatable(object, SurpriseBox_mt) 
end 

------------------------------------------------- 

function SurpriseBox:CreateBoxes() 
    local box1 = BoxClass.new('palo', 'images/chestClose.gif', 'OPEN') 
    local box2 = BoxClass.new('moneda', 'images/chestClose.gif', 'OPEN') 

    self.boxes = { box1, box2} 
end 

訪問函數CreateBoxes()後,表中沒有任何內容。

感謝您的幫助!

+0

查看我的答案的解釋。至於你的代碼,你正在複製表的創建。也就是說,在你的構造函數中,你創建一個空的'boxes'表,並在'CreateBoxes'函數中用另一個表替換該表。所以要麼不在構造函數中創建它,要麼只是將其填充到「CreateBoxes」中。否則它效率低下。 – 2013-05-13 09:25:45

+0

感謝您的幫助,但只有一個問題。如果我在構造函數中創建'boxes'表,並且想要在'CreateBoxes()'函數中插入元素,我可以這樣做嗎? 'table.insert(self.boxes,element)' – Crisiiii 2013-05-13 10:37:11

+0

是的,你可以。由於只插入2個元素,所以沒有太大的區別,但通常情況下,如果要填充數組,最好跟蹤變量中元素的數量(例如'index'),然後執行明確的賦值 - 'self.boxes [index] = element'。它更高效,因爲'table.insert'總是檢查數組中的項目數量,然後才插入項目。 – 2013-05-13 10:43:45

回答

4

當你調用SurpriseBox:CreateBoxes(),該self參數仍然指向SurpriseBox表,而不是object表創建。你或許應該這樣做是這樣的:

function SurpriseBox.new() -- constructor 
    local object = setmetatable({boxes = {}}, SurpriseBox_mt) 
    object:CreateBoxes() 
    print('constructor -> ' .. #object.boxes) 
end 

的關鍵是調用之前分配給元表和CreateBoxes()上調用它的object,不SurpriseBox

+0

完美地工作,那是我的主意!謝謝你的解釋! – Crisiiii 2013-05-13 10:24:25