Lua: Как брать только определенные функции из библиотеки?

#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 если производительность имеет значение, вы все равно делаете функцию локальной, так что кого волнует, сколько функций загружается из файла