Lua singleton при повторном требовании - PullRequest
0 голосов
/ 23 мая 2018

Допустим, у меня есть какая-то оболочка для некоторого класса:

local wrapper = {}
local some_library = require('some-library')

wrapper._library = some_library.new(...)

return wrapper

Если я require моя оболочка в разных файлах, будет ли каждый раз создаваться новый экземпляр some_library?то есть

// file1
local file1 = {}
local wrapper = require('wrapper')
-- add methods to file1
return file1

// file2
local file1 = require('file1')
local wrapper = require('wrapper')

И тогда я делаю lua file2

В этом случае wrapper включается дважды;один раз внутри file1, которого требует file2, и один раз сам file2.Будут ли сейчас два экземпляра some-library?Как создать синглтон, если мне нужен только один экземпляр?

1 Ответ

0 голосов
/ 23 мая 2018

Короткий ответ:

нет

Длинный ответ :

Когда вы require файл, lua сначала проверяет, был ли модуль ужебыл загружен.Если нет, он загружает (выполняет) файл и сохраняет его возвращаемое значение в глобальной таблице, где он кэшируется.Это означает, что a) some-library требуется только один раз и 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"

И если вам действительно скучно, вы можете создать библиотеку (в виде таблицы), которая при вызове, как если бы она была функцией (используя __call metamethod) возвращает новый экземпляр библиотеки, как и первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...