当您需要时使用Lua singleton
假设我有一些类的包装:当您需要时使用Lua singleton,lua,Lua,假设我有一些类的包装: local wrapper = {} local some_library = require('some-library') wrapper._library = some_library.new(...) return wrapper 如果我需要不同文件中的我的包装器,是否每次都会创建某个库的新实例?i、 e // file1 local file1 = {} local wrapper = require('wrapper') -- add methods t
local wrapper = {}
local some_library = require('some-library')
wrapper._library = some_library.new(...)
return wrapper
如果我需要不同文件中的
我的包装器,是否每次都会创建某个库
的新实例?i、 e
// file1
local file1 = {}
local wrapper = require('wrapper')
-- add methods to file1
return file1
// file2
local file1 = require('file1')
local wrapper = require('wrapper')
然后我做了lua文件2
在这种情况下,wrapper
包含两次;一次进入file1
需要的file2
,一次进入file2
本身。现在是否会有两个某个库的实例?如果我只需要一个实例,如何创建单例?简短回答:
不
:
当您需要文件时,lua首先检查模块是否已加载。如果没有,它将加载(执行)该文件并将其返回值保存到缓存该文件的全局表中。这意味着a)某个库只需要一次,b)包装器也是如此,因此一个库只需要一个包装器;与一个库的多个包装器或单个库的多个包装器不同
请记住:如果模块返回的不是库代码,而是一个随后创建库代码的函数,则只缓存该函数,但每次运行该函数时,它都会返回库对象的不同副本。例如:
-- lib.lua
return function()
{ foo = function(bar) print("fooing a bar...") end }
end
-- program.lua
factory_1 = require "lib"
factory_2 = require "lib"
print(factory_1 == factory_2) --> prints "true"
lib_1 = factory_1()
lib_2 = factory_1() -- not a typo, it's factory_1 called twice
print(lib_1 == lib_2) --> prints "false"
如果你真的很无聊,你可以创建一个库(作为一个表),当调用它时,它就像一个函数一样(使用\u调用
元方法)返回一个新的库实例,就像第一个一样。当你想要全局的东西时,不要使用local
。基本上,它应该工作尝试再次调用require
不应该工作。也可以查看@Konrad,但我不想将包装器定义为全局的。我想在任何时候将其导入到文件的作用域中。如果我没有local
,那么wrapper
将成为一个全局变量。