迭代来自类的对象

时间:2014-09-11 06:05:54

标签: class object lua lua-table

我正在从类中创建对象,并希望稍后迭代它们。有没有比这更有效的方法?

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)

是否有更有效的方法来迭代对象,而不是将它们插入到构造函数中的某种对象表中?

1 个答案:

答案 0 :(得分: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)等。