2017-04-04 18 views
2

所以我有一個for循環:for循環中值過多投入在我的表

for k, pt in pairs(points) do 
    self.centers[k] = Center:new() --<centers> is part of my Map object, and Center is an object 
    local bottomleft = Corner:new() 
    table.insert(self.centers[k].corners, bottomleft) 
    ...--repeats 4 times for each corner of a square 
end 

有列表中的256點(點),當我嘗試籤多少個值每個中心對象在列表(中心),它出來的:

print(#self.centers[1].corners) --> 1024 

我不知道爲什麼會出現在每一個(center.corners)名單的4倍多的值時,應該只有4。

我該如何解決這個問題?

編輯:

function Center:new (o) 
    o = o or {} 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

這是中心:新的()方法

+0

我們可以看到點表和/或中心的新方法嗎? – warspyking

+1

我問這個,因爲如果Center:new返回相同的對象,這很容易解釋。 – warspyking

+0

功能中心:新的(O) \t O = o或{} setmetatable(O,個體經營) \t自.__指數=自 \t回覆O 結束 – Denfeet

回答

1

當你創建一個新的中心對象設置

.__index = self 

所以以後當你指數

self.centers[k].corners 

在這一行

table.insert(self.centers[k].corners, bottomleft) 

它返回self對象,從而導致你的角落被插入到什麼,我認爲是Center

看到,因爲你添加4個角這個同桌256倍,它不加入1024個角落對於每個表格,它將它們添加到單個表格中,您正在編制索引並且您甚至沒有意識到。

你的解決方法很簡單,只需將邊角屬性添加到每個中心:

function Center:new (o) 
    o = o or {corners={}} 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

這工作,因爲如果指數在表中不存在已經 __index僅火災。這會停止重定向。

產品號:感謝您提供Center:new()的代碼,但如果沒有它,這個答案將無法實現!