激活节点MCU Lua 8266的文件

我正在尝试理解在Lua中使用dofile()的用途。 在init.lua文件中放置一行其他文件与函数声明,wifi初始化等是否是一种好的实践? init.lua:

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

tmr.alarm(0,3000,function()

runprogram()

end)

这将大大减少要测试的程序的下载时间。

dofile(xyz.lua)的效果与xyz.lua代码包含在“myprogram.lua”文件中的效果是否相同?

点赞
用户7396148
用户7396148

另一种处理这个话题的方法是使用 require 函数。

requiredofile 类似,它执行一个 Lua 文件,但它也内置了更多的智能性。

Lua require

加载给定的模块。该函数首先查找 package.loaded 表,以确定 modname 是否已被加载。如果是,则 require 返回存储在 package.loaded[modname] 中的值。否则,它尝试查找该模块的加载器。

require 是加载模块的常用实践方法,模块类似于库。 将文件设置成模块的好处是可以通过在模块内定义作用域来避免覆盖另一个文件中的函数。

一个名为 foo.lua 的模块的示例代码:

local foo {}

function foo.bar(a)
    local a = x + 7
    print(a)
end
-- 在 foo 表内定义更多函数
-- ...

return foo

使用 require 引用模块的示例:

local f = require("foo")

f.bar(7)
2018-12-21 17:09:35
用户8872539
用户8872539

一般的 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 之前在全局环境中添加更多的变量和函数,可以在 main.lua 中简单地使用 require 添加它们。

local initWifi = require 'InitWifi.lua'

它将执行类似于 dofile() 的功能,但具有更多的控制和错误处理。

您也可以在 main.lua 中使用 initWifi.lua 中的函数:

initWifi.helperFunct(param1)
2018-12-28 16:54:03