在lua语言中修改的模块文件(module)不会在使用的文件(require)中立即生效

硬件:ESP8266为核心的wemos d1 mini

https://s.taobao.com/search?q=wemos+d1+mini&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20190315&ie=utf8

固件:NodeMCU

任务:以module和require的形式封装自定义的库

编程语言:lua

IDE:ESPlorer

问题描述:

修改模块代码,删除原有文件,再次上传新文件,lua解释器并不加载新的文件(module),还是用原先的文件!

--File : module.lua
local module = {}
function module.foo()
  print("module.foo called")
end
return module
-- File : main.lua
local mod = require("module")
mod:foo()

第一次下载module.lua和main.lua到wemos上,运行main.lua,输出为

> dofile("main.lua")
module.foo called

此时在module.lua中修改foo代码:

--File : module.lua
local module = {}

function module.foo()
  print("module.foo changed")
end
return module

再次下载module.lua运行main.lua,输出结果为

> dofile("main.lua")
module.foo called

结果没有变化,此时查看wemos 中module.lua的代码,发现代码已经修改为changed!!

只有reset wemos后再次运行main.lua,新的module.lua才会生效

NodeMCU custom build by frightanic.com
    branch: 1.5.4.1-final
    commit: f03a8e45261fb5ab260e316173baacae9a248a62
    SSL: false
    modules: dht,file,gpio,mqtt,net,node,tmr,uart,wifi
 build created on 2019-01-08 13:05
 powered by Lua 5.1.4 on SDK 1.5.4.1(39cb9a32)
lua: cannot open init.lua
> print(uart.setup(0, 115200, 8, 0, 1, 1 ))
115200
> 
Communication with MCU...
Got answer! AutoDetect firmware...

NodeMCU firmware detected.
=node.heap()
45144
> dofile("main.lua")
module.foo changed


原因:

require (modname)

功能:加载指定的模块。

此函数先检测package.loaded表中是否存在modname,存在则直接返回当中的值,没有则通过定义的加载器加载modname。

显然require 并没有比较文件新旧重新加载

解决方案,可以在package.loaded (table)删除modname,再次require;

或者用dofile代替require

local mod = dofile("module.lua")注意需要加上文件类型

结论:

调试module时,尽量使用dofile("modulename.lua")

稳定运行时,可以使用require("modulename")

你可能感兴趣的:(lua)