【问题标题】:Iterate through objects from class遍历类中的对象
【发布时间】:2014-11-04 23:23:02
【问题描述】:

我正在从一个类创建对象,并希望稍后对其进行迭代。还有比这更有效的方法吗?

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)

有没有比在构造函数中将对象插入到某种对象表中更有效的方法来迭代对象?

【问题讨论】:

  • 我知道,认为在这个例子中被命名为不好的方式,但这只是一个例子,你应该理解这个问题。
  • 为什么你认为目前的方法效率不高?
  • 那样做感觉很糟糕,...不知道为什么。
  • 好的,如果这个方法是有效的,最好从构造函数返回“objects.object”,而不仅仅是“object”,以确保它引用正确的内存?
  • @Sempie:只有一个对象:局部变量objectobjects[#objects] 是相同的(objects.object 是不同的东西,可能是nil)。请不要将对象存储在表中会阻止它们被垃圾收集。如果您不希望这样,请将objects 设为弱键表,存储objects[object] = true 之类的对象,并通过pairs 进行迭代。

标签: class object lua lua-table


【解决方案1】:

您使用的方法是将class1 的每个“实例”插入到名为objects 的表中。如果您想遍历class1 的所有实例,即使用for 循环对每个实例执行操作,那么您别无选择,您必须将实例存储在表中,因为您正在做。

下一个问题是,该表存在的位置是否会对性能产生影响?在 Lua 中,访问局部变量(和上值)的性能比访问全局变量稍好,但差异是否重要取决于您需要对全局变量做什么,以及在迭代的情况下,您在迭代。参见例如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),等等。

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2014-02-19
    • 2013-10-19
    • 2014-09-07
    • 2022-11-14
    • 2011-06-15
    相关资源
    最近更新 更多