lua require
Posted Code~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua require相关的知识,希望对你有一定的参考价值。
环境: Mac Xcode cocos3.10 lua
一,require作用类似于#include,其特性为:
1. 根据搜索目录加载文件
2. 会判定文件是否已经加载,避免重复加载同一个文件
特性1说明:
require是如何搜索目录加载文件的,为了说明更清晰些,事先看一个加载不存在的.lua文件,log的提示:
no file ‘/usr/local/share/luajit-2.1.0/ app/update/***.lua‘ no file ‘/usr/local/share/lua/5.1/app/update/***.lua‘ no file ‘/usr/local share/lua/5.1/app/update/***/init.lua‘ no file ‘./app/update/***.so‘ no file ‘/usr/local/lib/lua/5.1/app/update/***.so‘ no file ‘/usr/local/lib/lua/5.1/loadall.so‘
根据log的提示,我们会发现,Lua搜索了一系列的路径进行查询***.lua文件是否存在。这些路径从何而来?
一般情况下,我们所见到的路径是一个目录列表,比如: c:/windows/...。然而Lua中的require的路径采取的是一个模式列表,每一个模式包含一个可选的?的文件名,在匹配的时候,lua首先会将?用指定的虚文件名替换,查看该文件是否存在。比如:
?; ?.lua; /usr/local/?.lua; /usr/local/?/init.lua
为了确定其搜索路径,Lua启动后会根据全局变量LUA_PATH_DEFAULT或LUA_CPATH_DEFAULT进行检查匹配,可以看一luajit/include/luaconf.h文件,代码如下:
#if defined(_WIN32) // win32环境.... #else #define LUA_ROOT "/usr/local/" #define LUA_LDIR LUA_ROOT "share/lua/5.1/" #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" #ifdef LUA_XROOT #define LUA_JDIR LUA_XROOT "share/luajit-2.0.1/" #define LUA_XPATH ";" LUA_XROOT "share/lua/5.1/?.lua;" LUA_XROOT "share/lua/5.1/?/init.lua" #define LUA_XCPATH LUA_XROOT "lib/lua/5.1/?.so;" #else #define LUA_JDIR LUA_ROOT "share/luajit-2.0.1/" #define LUA_XPATH #define LUA_XCPATH #endif #define LUA_PATH_DEFAULT "./?.lua;" LUA_JDIR"?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua" LUA_XPATH #define LUA_CPATH_DEFAULT "./?.so;" LUA_CDIR"?.so;" LUA_XCPATH LUA_CDIR"loadall.so" #endif
对比着log提示,我们可以看到lua会根据LUA_PATH_DEFAULT首先搜索.lua文件,如果没有就会再根据LUA_CPATH_DEFAULT进行搜索文件。
require加载某文件成功后,若该文件有返回值,返回该返回值,若无返回值,返回true。且将其返回值存储到package.load中。
特性2说明:
加载某文件时,require会根据package.load判定该文件是否存在,以此避免重复加载。
但针对于游戏热更新的情况下,尤其更新了.lua文件,需要替换的时候,该怎么办呢?我们可以采取如下的方式:
-- 要注意重新加载的顺序 package.loaded["*"] = nil required("*") package.loaded["**"] = nil required("**") package.loaded["***"] = nil required("***")
或者,修改luaconf.h文件中的匹配模式代码,并重新生成新的库文件,使其require "test" 和 require "test.lua"判定为不同文件,加载两次,但不推荐使用。
以上是关于lua require的主要内容,如果未能解决你的问题,请参考以下文章