遍历类中的对象

我从一个类中创建对象,想要以后迭代它们。有比这更有效的方法吗?

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)

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

点赞
用户869951
用户869951

你使用的方法是将每个 class1 的“实例”插入到一个名为 objects 的表中。如果你想迭代所有 class1 的实例,即使用 for 循环对每个实例进行某些操作,那么你别无选择,必须将实例存储在表中,就像你现在正在做的那样。

接下来的问题是,表存在的位置是否会影响性能?在 Lua 中,访问本地变量(和 upvalue)比访问全局变量稍微快一些,但这种差异是否重要取决于你需要对全局变量做什么,对于迭代的情况,还要看你在迭代主体中所做的操作。例如,请参阅使用本地变量进行优化

很可能,在迭代循环主体中的操作将使任何差异(在你的表是本地还是全局的情况下)变得微不足道。你可以查看我该如何提高 Lua 程序的性能?,但最重要的是,只根据以下内容进行优化:

  • 性能分析:使用 os.clock,可能还有类似于 PepperFish 这样的东西——但是要注意:我没有尝试过它。
  • “合理设计”原则:仔细选择你的容器和算法,例如,如果你在设计中不小心,可能会出现 O(N^2) 而不是 O(N log N),同样地,可能会出现 O(N log N) 而不是 O(log N),或者 O(N) 而不是 O(1) 等等。
2014-09-11 13:04:36