вызов файлов nodemcu lua 8266

Я пытаюсь понять использование dofile() в lua. Является ли хорошей практикой помещать в файл init.lua ряд других файлов с объявлениями функций, инициализациями Wi-Fi и т. д.? init.lua:

dofile("InitWifi.lua") 
dofile(helperfunctions.lua") 
dofile(...) dofile(..)

tmr.alarm(0,3000, function()

runprogram()

end)

Это значительно сократит время загрузки тестируемой программы.

Эффект dofile(xyx.lua ) такой же, как если бы код xyz.lua содержался в файле «myprogram.lua»?


person I0sens    schedule 21.12.2018    source источник
comment
(Короткий ответ: да) Вы можете писать разные части вашей программы в разных файлах. Все эти части используют один и тот же набор глобальных переменных. Но каждая часть имеет свои собственные изолированные локальные значения и значения.   -  person Egor Skriptunoff    schedule 21.12.2018
comment
В нашем разделе часто задаваемых вопросов содержится большое количество информации, особенно по адресу nodemcu.readthedocs.io/en/master/en/lua-developer-faq/. Мы также опубликовали немного измененный пример шаблона init.lua по адресу nodemcu.readthedocs.io/en. /master/en/upload/#initlua. Ответ Нифима хороший.   -  person Marcel Stör    schedule 23.12.2018
comment
Примеры Lua-модулей NodeMCU можно найти на странице github.com/nodemcu. /nodemcu-firmware/tree/master/lua_modules   -  person Marcel Stör    schedule 23.12.2018


Ответы (2)


Другой способ справиться с этой темой — использовать функцию require.

require работает аналогично dofile в том смысле, что он выполняет файл Lua, но также имеет больше встроенного интеллекта.

Lua требует

Загружает указанный модуль. Функция начинается с просмотра таблицы package.loaded, чтобы определить, загружено ли уже имя мода. Если это так, то require возвращает значение, хранящееся в package.loaded[modname]. В противном случае он пытается найти загрузчик для модуля.

require — обычная практика загрузки модулей, модуль подобен библиотеке. Преимущество настройки ваших файлов как модулей заключается в том, что вы можете избежать перезаписи функции из другого файла, определив область действия в модуле.

Пример кода модуля foo.lua:

local foo {}

function foo.bar(a)
    local a = x + 7
    print(a)
end
-- More functions defined inside the foo table
-- ...

return foo

Пример использования require с модулем:

local f = require("foo")

f.bar(7)
person Nifim    schedule 21.12.2018
comment
Большое спасибо всем! Мне нужно будет изучить оператор require. Я пока не очень понимаю разницу между dofile и require - person I0sens; 24.12.2018

общая практика init.lua заключается в выполнении основного файла Lua после небольшого времени тестирования.

countdown = 5
tmr.alarm(0,2000,1,function()
if APPLICATION_REPROGRAM == nil then
    print("coutdown : "..countdown)
    countdown = countdown-1
    if countdown<1 then
        tmr.stop(0)
        countdown = nil
        local s,err
        if file.open("main.lua") then
            file.close()
            s,err = pcall(function() dofile("main.lua") end)                   
        end
        if not s then print(err) end
    end
end
end)

Если вам нужно добавить больше переменных и функций в глобальную среду перед выполнением main.lua, вы можете просто добавить их, используя require внутри main.lua.

local initWifi = require 'InitWifi.lua'

он будет делать то же самое, что и dofile(), но с большим контролем и обработкой ошибок.

вы также можете использовать функции initWifi.lua внутри main.lua:

initWifi.helperFunct(param1)
person Thevananthan    schedule 28.12.2018