Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当您需要时使用Lua singleton_Lua - Fatal编程技术网

当您需要时使用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
将成为一个全局变量。