#lua
#lua
Вопрос:
У меня есть файл библиотеки service_functions.lua. В нем сотни функций.
function foo1()
------------
end
function foo2()
------------
end
и так далее
Я не хочу загружать все функции.
Теперь я делаю:
dofile(script_path.."\service_functions.lua")
и получить их все.
Как получить только определенные функции?
Ответ №1:
но если, как вы написали в вопросе, вам нужна минимальная загрузка памяти, то, возможно, мой вариант модуля пригодится:
local arg={...}
local function foo1() print("foo1")
end
local function foo2() print("foo2")
end
local function foo3() print("foo3")
end
local function foo4() print("foo4")
end
local M = {foo1=foo1, foo2=foo2, foo3=foo3, foo4=foo4}
if not arg[1] then return M -- all
elseif type(arg[1])=="string" then
local x = {}
x[arg[1]] = M[arg[1]]
return x -- 1 function by name
elseif type(arg[1])=="table" then
local res = {}
for k,v in pairs(arg[1]) do
res[v] = M[v]
end
return res -- some functions
end
и возвращать только то, что нужно из «сотен» функций
-- only 1 function loaded
local x = loadfile("funk.lua")("foo1")
x.foo1()
-- only 2 functions loaded
local x = loadfile("funk.lua")( { "foo1", "foo2"} )
x.foo1()
x.foo2()
-- all functions loaded
local x = loadfile("funk.lua")()
x.foo1()
x.foo2()
x.foo3()
x.foo4()
Комментарии:
1. Спасибо! вы мне очень помогли
2. Как это использует минимальный объем памяти? Все функции компилируются в любом случае. Код даже создает 3 таблицы.
3. @lhf это правда, но сборщик мусора очистит его позже
4. должен ли я использовать функцию collectgarbage() в своем коде или это будет сделано автоматически?
5. @IgorK. вы можете попробовать, но не заметить разницы, а это значит, что сборщик сам удалил ненужное после использования второго модуля… главное, чтобы loadfile возвращал не весь модуль, а часть
Ответ №2:
Напишите свою библиотеку следующим образом:
local M={}
function M.foo1()
------------
end
function M.foo2()
------------
end
return M
Затем загрузите библиотеку с
local lib=dofile(script_path.."\service_functions.lua")
и извлеките нужные вам функции с помощью
foo1 = lib.foo1
Комментарии:
1. Отлично! Спасибо, дорогой друг.
Ответ №3:
Удалите любую функцию, которая вам не нужна / не нужна, из service_functions.lua или оберните библиотеку своим собственным модулем, как показано lhf
Вы не можете выполнить только часть файла Lua. Файл загружается и выполняется как один фрагмент.
В качестве альтернативы просто смиритесь с этим. Вам не повредит иметь больше доступных функций.
Комментарии:
1. Это приводит к снижению производительности и ненужному потреблению памяти. Для доступа к определенной функции требуется больше времени.
2. @IgorK. это не повод отклонять мой правильный ответ. не будь таким неблагодарным. эти функции попадают в таблицу. не имеет значения, сколько там элементов. проблемы с памятью и производительностью при определении функций на ПК незначительны.
3. @IgorK если производительность имеет значение, вы все равно делаете функцию локальной, так что кого волнует, сколько функций загружается из файла