• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос NodeMCU, Lua - доступ к функциям в загружаемом файле

AlVal

New member
Пытаюсь разобраться как правильно работать с подгружаемыми функциями в Lua (для экономного использования памяти). Пока не ясно.
Есть два файла для теста: "main.lua" - основная программа, и "f_test.lua" - с подгружаемыми функциями.

"main.lua" содержит простые переменные, и пытается напечатать их значение с помощью функций хранящихся во втором файле.
Код:
e=5                     --
f=15                    -- Объявлены две переменные
loadfile("f_test.lua")  -- Загружен в ОЗУ файл с функциями
print(e,f)              -- Контрольная печать переменных (убедиться, что они понятны интерпретатору)
testfunc_1()            -- Вызов первой функции
testfunc_2(f)           -- Вызов второй функции
testfunc_3(4)           -- Вызов третьей функции
"f_test.lua" содержит функции печати, отличающиеся только способом получения параметра.
Код:
function testfunc_1()
    print(e)        -- Печать глобальной переменной (e)
end

function testfunc_2(g)
    print(g)        -- Печать аргумента функции (g)
end

function testfunc_3(i)
arr = {10,20,30,40,50,60,70,80}
    print(arr[i])   -- Печать из массива, по принятому извне индексу (i)
end
Если загружать файл с помощью loadfile("f_test.lua"), то выдаётся ошибка при вызове первой же функции.
Код:
dofile('f_test.lua')
5    15    -- Контрольная печать переменных, до этого момента всё нормально
main.lua:5: attempt to call global 'testfunc_1' (a nil value)
stack traceback:
    main.lua:5: in main chunk
    [C]: in function 'dofile'
    stdin:1: in main chunk
>
При этом непонятно, загрузился ли файл, и если да, то почему функции не доступны? Ещё смущает, что применяется почему-то dofile, а не loadfile... Это неправильная команда?

Если же второй файл подгружать в память командой dofile("f_test.lua"), то доступ к функциям есть, и всё печатается.
Код:
dofile('f_test.lua')
5    15   -- Контрольная печать
5         -- Первая функция
15        -- Вторая функция
40        -- Третья функция
>
Но т.к. это команда загрузки и запуска, то есть сомнение в корректности такого способа подгрузки функций.

Собственно вопросы:
1. Как же правильно подгружать файлы с дополнительными функциями?
2. Как эти файлы потом удалять из памяти?
 
Сверху Снизу