【问题标题】:evoking files nodemcu lua 8266唤起文件nodemcu lua 8266
【发布时间】:2019-05-21 13:27:48
【问题描述】:

我正在尝试了解 dofile() 在 lua 中的使用。 将其放入 init.lua 是一种很好的做法 归档一行包含函数声明、wifi 初始化等的其他文件? init.lua:

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

tmr.alarm(0,3000, function()

runprogram()

end)

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

dofile(xyx.lua)的效果和xyz.lua一样吗 代码包含在“myprogram.lua”文件中?

【问题讨论】:

标签: lua esp8266 nodemcu


【解决方案1】:

处理此主题的另一种方法是使用require 函数。

require 的操作与 dofile 类似,因为它执行 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
-- More functions defined inside the foo table
-- ...

return foo

在模块中使用 require 的示例:

local f = require("foo")

f.bar(7)

【讨论】:

  • 非常感谢大家!我将不得不研究“要求”声明。我还不太了解 dofile 与 require 的区别
【解决方案2】:

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)

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 2016-01-19
    • 2017-07-16
    • 2018-10-26
    • 2015-11-17
    • 2016-04-01
    • 2019-05-06
    • 2019-05-18
    • 2020-05-05
    相关资源
    最近更新 更多