Lua热更原理以及加载规则
要实现Lua的热更新,首先要了解Lua的模块加载机制,热更新的核心就是替换package.loaded中的模块。
加载规则:
包管理库提供了从Lua中加载模块的基础库。只有一个导出函数直接放在全局环境中:require。所有其他的部分都导出在表package中。
require(modname)
查询全局缓存表package.loaded:这个函数首先查找package.loaded表,检测modname是否被加载过。如果被加载过,require返回package.loaded[modname]中保存的值。否则,它试着为模块寻找加载器。
通过package.searchers查找加载器:require遵循package.searchers序列的指引来查找加载器。如果改变package.searchers中的序列,也会改变require如何查找一个模块的方式。
查找加载器:首先require查找package.preload[modname]。如果这里有一个值(必须是一个函数),则为加载器。否则require会使用Lua加载器去查找package.path的路径。如果查找失败,接着使用C加载器去查找package.cpath的路径。如果都失败了,再尝试一体化加载器(参见package.searchers详解)
加载器调用规则:每当找到一个加载器,require都用两个参数调用加载器:modname和一个在获取加载器过程中得到的参数(如果是通过查找文件得到的加载器,这个额外的参数即为文件名)。如果加载器返归非空值,require将这个值赋给package.loaded[modname]。如果加载器没能返回一个非空值用于赋给package.loaded[modname],require 会将true赋给 package.loaded[modname]。 无论加载器返回什么结果,require都会为package.loaded[modname]
设置最终值。
报错:在加载或运行模块时有错误,或是无法为模块找到加载器,require都会抛出错误。
package.loaded
存储已经被加载的模块:当require一个modname模块得到的结果不为假时,require返回这个存储的值。require从package.loader中获得的值仅仅是对那张表(模块)的引用,改变这个值并不会改变require使用的表(模块)。
package.preload
保存一些特殊模块的加载器:这里面的值仅仅是对那张表(模块)的引用,改变这个值并不会改变require使用的表(模块)。
package.path
Lua加载器的搜索路径:使用环境变量LUA_PATH_5_3或LUA_PATH初始化。或者采用luaconf.h中的默认路径。环境变量中的所有";;"都会被替换为默认路径。
package.cpath
C加载器的搜索路径:使用环境变量LUA_CPATH_5_3或LUA_CPATH初始化。或者采用luaconf.h中定义的默认路径。
package.searchers
require查找加载器的表:这个表内的每一项都是一个查找器函数。当加载一个模块时,require按次序调用这些查找器,传入modname作为唯一参数。此方法会返回一个函数(模块的加载器)和一个传给这个加载器的参数。或返回一个描述为什么没有找到这个模块的字符串或者nil。
Lua共有四个查找器函数:
第一个查找器就是简单的在package.preload表中查找;
第二个查找器用于查找Lua库的加载库。它使用存储在package.path中的路径查找工作。查找过程和函数package.searchpath描述的一致;
第三个查找器用于查找C库的加载库。它使用存储在package.coath中的路径查找工作。查找过程和函数package.searchpath描述的一致;
第四个搜索器是一体化加载器,从C路径中查找指定模块的根名字。
除了第一个搜索器外,每个搜索器都会返回找到的模块的文件名。这和package.searchpath的返回值一样,第一个搜索器没有返回值。
package.searchpath(name, path[,sep[,,rep]])
在指定的path中搜索指定的name:路径是一个包含一些列分号分隔的模板构成的字符串。对于每个模板,都会用name替换其中的每个问号(前提是有问号)。且将其中的sep(点".")替换为rep(系统的目录分隔符"/")。谈候场时打开这个文件名。
例如,如果路径是字符串 "./?.lua;./?.lc;/usr/local/?/init.lua"
搜索foo.a 这个名字将一次尝试打开文件./foo/a.lua ./foo/a.lc 以及 /usr/local/foo/a/init.lua
返回第一个可以用读模式打开(并马上关闭该文件)的文件的名字。如果不存在这样的文件,返回nil加上错误的消息。(错误消息列出了所有尝试打开的文件名)
Lua热更原理以及加载规则相关推荐
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
<Spring Cloud Alibaba基础教程>连载中,关注我一起学期!前情回顾: <使用Nacos实现服务注册与发现> <支持的几种服务消费方式> <使 ...
- 在Flutter中更快地加载您的图像资源
本文主要介绍在Flutter中更快地加载您的图像资源 我们可以将图像放在我们的资产文件夹中,但如何更快地加载它们?这是 Flutter 中的一个秘密函数,可以帮助我们做到这一点 - precacheI ...
- 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...
下面练习中,你将添加表单加载规则,将四个文本框域和图片控件与用户配置文件web service连接.当使用用户配置文件web service时,你需要将控件和来自web service合适的域绑定.这 ...
- 浏览器是直接加载二进制图片更快还是加载base64编码的图片更快?
问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 浏览器是直接加载二进制图片更快还是加载base64编码的图片更快?哪个效率更高? 例如: <img src ...
- 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则
下面练习中,你将添加表单加载规则,将四个文本框域和图片控件与用户配置文件web service连接.当使用用户配置文件web service时,你需要将控件和来自web service合适的域绑定.这 ...
- Drools6.4动态加加载规则之(三)kie-wb与kie-server的集群应用
1.说明 本例讲解的是使用6.4.0.Final版本kie-wb(drools workbench)与 kie-server(KIE Execution Server)的集群搭建,:使用wildfly ...
- Android插件化原理—ClassLoader加载机制
前面<Android 插件化原理学习 -- Hook 机制之动态代理>一文中我们探索了一下动态代理 hook 实现了 启动没有在 AndroidManifest.xml 中显式声明的 Ac ...
- drawable和values的加载规则
Google搞了一大套hdpi.xhdpi之类的这些东西,简单说来,就是为了让我们轻松实现"与设备密度无关的视觉大小一致性",注意这里的"视觉大小一致性",就是 ...
- Unity 游戏用XLua的HotFix实现热更原理揭秘
本文通过对XLua的HoxFix使用原理的研究揭示出来这样的一套方法.这个方法的第一步:通过对C#的类与函数设置Hotfix标签.来标识需要支持热更的类和函数.第二步:生成函数连接器来连接LUA脚本与 ...
最新文章
- android matrix 简书,android matrix
- python解包裹_关于Python中包裹传参和解包裹的理解
- shardingjdbc每月分表_shardingjdbc分库分表测试
- Loss Function view
- java设置属性的取值范围是多少_jvm-Java系统属性的范围
- Linux网络协议栈:NAPI机制与处理流程分析(图解)
- python oracle query,python链接oracle/plsql数据库 ,查询功能(query) 用cursor fetchall
- terminal mysql 停止_转载MySQL之终端(Terminal)管理MySQL
- Perf -- Linux下的系统性能调优工具
- 群晖nas存储系统原理_群晖NAS入门教程第四节:群晖存储空间管理员功能和磁盘阵列类型的简介...
- 黑莓9000和9900哪个好_入手黑莓9900,黑莓手机9900怎么样?
- 局域网内两台电脑ping不通
- error: exportArchive: No signing certificate “iOS Distribution“ found
- 高防IP防护效果怎么样?甜甜告诉您
- html5 canvas爆炸,html5 canvas彩色爆炸的小球动画特效
- 【生活】如何线上办理持有广州社保人员的异地分娩医保登记 - 定点医院 - 异地就医报销相关
- java面试题saas
- 小明加密通道进入_「成都全接触」最新!成都8条地铁进展来了!年底还有5条铁路、9条通道!...
- 一个优秀的Linux学习网址(中文)
- 近期用户/金蝶等ERP系统 MS SQL Server 数据库故障 典型恢复案例
热门文章
- jquery 绘图工具 flot 使用
- NFC对于大家真的实用吗
- android studio计时器怎么用,android - Android Studio:启动倒数计时器时应用崩溃
- 10bit为什么比8bit节省带宽
- 互联网晚报 | 10月14日 星期四 | 钉钉宣布用户数破5亿;顺丰王卫将出任嘉里物流董事会主席;字节跳动巨量引擎进军职业教育...
- 机器学习——科学计算库(Numpy,Matplotlib,Pandas)
- 互联网在线学习系统需求分析
- 七夕情节人,适合给IT男朋友送什么专属礼物?
- java timezone prc_TimeZone
- ZYNQ从放弃到入门(八)-PS和PL交互