2014-09-11 129 views
1

我從一個類創建對象,並希望稍後迭代它們。有沒有比這更有效的方法?通過類的迭代遍歷對象

class1 = {} 
class1.value1 = "1" 
class1.value2 = 2 
class1.tvalue1 = {} 

function class1:new() 
    local class = self 
    local object = {} 
    setmetatable(object,class) 
    class.__index = class 
    object.tvalue1 = {} 
    table.insert(objects, object) -- to iterate them later, stupid way I think 
    return object 
end 
function class1:alterValue1(input) 
    self.value1 = input 
    return self.value1 
end 
function class1:alterValue2(input) 
    self.value2 = input 
    return self.value2 
end 


randomName = class1:new() 
otherName = class1:new() 
weirdoName = class1:new() 
. 
. 
. 
(n) 

是否有一個更有效的方法來迭代對象,而不是將它們插入到構造函數中的某種對象表中?

+0

我知道,在這個例子中思想被命名爲壞方法,但它只是一個例子,你應該解決這個問題。 – Sempie 2014-09-11 06:14:27

+0

你爲什麼認爲目前的方法效率不高? – 2014-09-11 06:16:54

+0

這樣做只是感覺不好,......不知道爲什麼。 – Sempie 2014-09-11 06:18:04

回答

1

您使用的方法是將class1的每個「實例」插入名爲objects的表中。如果要遍歷class1的所有實例,即使用for循環對每個實例使用/進行操作,那麼您沒有選擇,必須將實例存儲在表中,就像您在做的那樣。

接下來的問題是,該表是否存在對錶現有影響?在Lua中,本地人(和upvalues)的訪問比訪問全局變量的性能稍微好一點,但是差異是否取決於你需要怎麼處理全局變量,在迭代的情況下,你在本體迭代。例如參見Optimizing Using Local Variables

在極有可能的情況下,迭代循環體中的操作將會產生任何影響(在您的表是局部還是全局之間)無關緊要。你可能想看看What can I do to increase the performance of a Lua program?,但最重要的,只有基礎上優化

  • 分析:使用os.clock,並可能像PepperFish - 買者自負:我還沒有嘗試過。
  • 「聲音設計」原則:仔細選擇你的容器和算法,例如,如果你不注意你的設計,你可以得到O(N^2)而不是O(N log N),同樣O(N log N)而不是O(log N),或者O(N)而不是O(1)等。