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的主要内容,如果未能解决你的问题,请参考以下文章

lua里面如何require一串lua格式的字符串

LUA require 搜索路径指定方法

lua学习之loadfile, dofile, require

Lua, Require, 可用函数

lua import 和 require 的区别

xLua使用require改变路径加载Lua脚本