当实例化多个lua对象时,何时使用require和new?

我正试图理解 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()
点赞
用户646619
用户646619

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)) -- 输出 true
r.name = "samantha"
print(s.name) -- 输出 samantha

第二种方法实际上是创建新的类实例。然而,与其创建一个 new 类方法不如使用 __call 元方法来调用类表本身更加熟悉。我已经编写了一个单文件 OOP 框架,它可以处理单一继承;你可以直接使用它或作为参考。

2014-10-23 22:14:27