我试图围绕在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()
答案 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来处理那个和单个继承;随意使用它或作为参考。