在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
wemos d1 mini

固件: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")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值