在实例化lua对象的多个实例时何时使用require vs new?

时间:2014-10-23 21:48:36

标签: lua

我试图围绕在Lua中定义和实例化对象的不同方式。

对于当前的问题,我想象的对象就像C结构一样简单(没有必要的方法)。

在以下两种方法之间,我们选择哪种方式是否重要?有实际的区别吗?我想选择“最少代码”,因为我最喜欢“少代码”。似乎第一种方法在某处出现问题。也许只是我。如果我们实例化10,000个mary会发生什么?这有关系吗?

第一种方式:

mary.lua

return {
  name = "mary"
}

main.lua

local r = require("mary")
local s = require("mary")
local t = require("mary")
local u = require("mary")

第二种方式:

mary.lua

local _O = {}

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

function _O:_create()
    self.name = "mary"
end

return _O

main.lua

local o = require("mary")
local r = o:new()
local s = o:new()
local t = o:new()
local u = o:new()

1 个答案:

答案 0 :(得分:3)

require是一个用于加载模块的函数,而不是实例化类。

require("mary")只加载mary.lua一次,然后将返回值存储在package.loaded["mary"]内。 require("mary")的所有后续结果都会返回package.loaded["mary"]处的对象,并且不会创建新实例。这使require不适合类实例化。

local r = require("mary")
local s = require("mary")
print(rawequal(r, s)) -- Prints true
r.name = "samantha"
print(s.name) -- Prints samantha

您的第二种方式实际上是创建新的类实例。但是,使用new元方法调用类表本身,而不是__call类方法。我写了one-file OOP framework来处理那个和单个继承;随意使用它或作为参考。