--[[  模块是类似于一个封装库,Lua5.1开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API的接口形式在其他地方调用  Lua的模块是由变量、函数等元素组成的table,所以要创建一个模块很简单,就是创建一个表,然后把需要导出的常量、函数放到创建的表中,最后使用return吧这个表返回去。  创建自定义模块]]--[[-- 把下面的代码存放到文件名为 my_module.lua 文件里-- 定义一个名为 module 的模块my_module = {}-- 定义常量my_module.constant = "constant是个常量,而且能直接访问"-- 定义一个函数function my_module.my_func1()  io.write("这个函数是public,外部能直接访问\n")endlocal function my_func2()  io.write("这个函数是private,外部无法访问\n")endfunction my_module.my_func3()   func2()endreturn my_module]] --[[  模块的结构就是表结构,可以像操作表那样来操作模块里面的元素。   演示代码中的函数my_func2()呗声明为程序块的局部变量,是一个私有函数,外部无法直接调用,只能通过模块里面的工公共接口函数来调用。 ]]-- **************************************************************************-- require 函数-- Lua提供了一个名为require的函数用来加载模块,要加载一个模块,只要简单地调用就可以了-- require("")-- require ""-- 执行require后会返回一个由模块常量或函数组成的table,并且还会定义一个包含该table的全局变量require("my_module")print(my_module.constant)-- constant是个常量,而且能直接访问my_module.my_func3()-- 这个函数是private,外部无法访问-- 给加载的模块定义一个别名变量local m = require "my_module"print(m.constant)-- 这是一个常量m.my_func1()-- 这个函数是public,外部能直接访问print("\n")-- 加载机制--[[ 对于自定义的模块,模块文件不是放在哪个文件目录都行,函数require有它自己的文件路径加载策略,它会尝试从Lua文件或C程序库中加载模块  require用于搜索Lua文件的路径是存放在全局变量package.path中,当Lua启动后,会以环境变量LUA_PATH的值来初始化这个环境变量。   如果没有找到该变量,则使用一个编译时定义的默认路径来初始化  当然,如果没有LUA_PATH这个变量,也可以自定义设置,在当前用户根目录下打开.profile文件(没有就创建,打开.bashrc文件也可以),  例如:把~/lua/路径加入LUA_PATH环境变量里  #LUA_PATH  export LUA_PATH="~/lua/?.lua;;"  文件路径是以";"号分割,最后的2个"::"表示新加的路径后面追加上原来的默认路径  接着,更新环境变量参数,使之立即生效  source ~/.profile  这时,假设package.path的值是  /usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua  那么,调用require("module")时就会尝试打开以下文件目录去搜索目标  /usr/local/share/lua/5.4/module.lua  /usr/local/share/lua/5.4/module/init.lua  /usr/local/lib/lua/5.4/module.lua  /usr/local/lib/lua/5.4/module/init.lua  ./module.lua;  ./module/init.lua  如果找到目标文件,则会调用package.loadfile来加载模块。否则,就回去找C程序库  搜索的文件路径是从全局变量package.cpath获取,而这个变量是通过环境变量LUA_CPATH来初始    /usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.so  搜索的策略跟上面的一样,只不过现在换成搜索的是so或dll类型的文件,如果找得到,那么require就会通过package.loadlib来加载它]]print(package.path)-- /usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.luaprint(package.cpath)-- /usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.soprint("\n\n")-- C语言包--[[  与Lua中写包不同,C语言包在使用以前必须加载并连接,最简单并且容易的实现方式是通过动态连接库机制  Lua在一个叫loadlib的函数内提供了所有的动态连接的功能,这个函数有两个参数:库的绝对路径和初始化函数。   来看看一个例子  local path = "/usr/local/lua/lib/libluasocket.so"  local f = loadlib(path,"luaopen_socket")  loadlib函数加载指定的库并连接到Lua,但是它并不打开load入的库(没有调用初始化函数),而是返回初始化函数作为Lua中的一个函数,然后可以直接在lua代码中调用这个返回的函数。  如果加载动态库或者查找初始化函数时出错,loadlib将返回nil和错误信息,我们可以修改前面一段代码,使其检测错误然后调用初始化函数  local path = "/usr/local/lua/lib/libluasocket.so"  -- 或者 path = "C:\\windiws\luasocket.dll",这个是windows平台下  local f = assert(loadlib(path, "luaopen_socket"))  f()  -- 这里才是真正打开库  通常,我们希望二进制的发布库包含一个与前面代码段相似的stub文件,安装的时候可以任意放在任何一个目录中,只需要改一改stub文件对二进制库的实际路径  将stub文件所在的目录路径加入到LUA_PATH里面,然后就可以直接使用require函数导入C语言写的库]

扫码关注一下呗~

无法加载模块:public_Lua模块与包相关推荐

  1. i.MX6系列加载华为ME901s-821模块使用PPP拨号上网

    i.MX6系列加载华为ME901s-821模块使用PPP拨号上网 PPP协议 内核中添加PPP协议支持 内核USB驱动支持 交叉编译PPP 拨号 PPP协议 PPP(点到点协议)是为在同等单元之间传输 ...

  2. 未能加载指定的模块“\Neo4j-Management.psd1

    未能加载指定的模块"\Neo4j-Management.psd1 解决方案 方法一 增加环境变量PSScriptRoot = "D:\beforeInstalling\neo4j- ...

  3. 单步调试理解webpack里通过require加载nodejs原生模块实现原理

    在webpack和nodejs里,我们经常使用require函数加载原生模块或者开发人员自定义的模块. 原生模块的加载,比如: const path = require("path" ...

  4. 【Ubuntu】自动加载第三方ko模块

    有时候,我们需要让系统加载第三方的内核模块,但是重新编译内核显然太繁琐,我们可以使用某些手段来手动加载或者自动加载这些模块. 手动加载 直接执行以下指令即可 sudo insmod *.ko 或者将k ...

  5. 微信和支付宝扫码之后,需要加载各种业务模块:

    作者:王大帅 链接:https://www.zhihu.com/question/55761088/answer/158872594 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  6. 如何实现动态加载Javascript 文件模块

    前端开发中仅在需要时的时候加载 JavaScript 模块.这样可以提供很大的性能,比如:您有一个组件,例如复杂的视频播放器,它可以使用大量 js,并且该视频仅在用户单击它时才会启动. 那么在这种情况 ...

  7. 解决VA加载失败问题:visual assist ({44630D46-96B5-488C-8DF9-26E21DB8C1A3})未加载。请与程序包供应商联系以获得帮助

    本人电脑win7 64位系统,最近需要接受一个VS2005编写的程序,用的全是很老的库,因此下载安装了VS2005,中间也是很多问题,反正解决了. 然后安装了va番茄助手(老版本最后安装老的助手版本1 ...

  8. [FairyGUI][Unity]加载FGUI打包成AB包的资源

    参考资料3 将发布后的文件打包为两个AssetBundle,即定义文件和资源各打包为一个bundle(desc_bundle+res_bundle).这样做的好处是一般UI的更新都是修改元件位置什么的 ...

  9. 解决URL存在特殊符号、异步线程池配置、动态加载lib下所有jar包

    一.解决URL存在特殊符号|{}?&.URL中包含%2F.URL中包含%5C import lombok.extern.slf4j.Slf4j; import org.springframew ...

  10. VS2010未能加载 'VSTS for Database Professionals'包的解决办法

    VS2010未能加载 'VSTS for Database Professionals'包的解决办法: 开始菜单->Microsoft Visual Studio 2010->Visual ...

最新文章

  1. php框架 css文件引用,yii框架中怎么引入css文件
  2. hive的新分区和旧分区的概念问题
  3. storm入门——本地模式helloworld
  4. input不可编辑属性_谁不喜欢图文并茂呢:基于多模态信息的属性抽取
  5. OpenGL模板测试通俗理解
  6. Python深入05 装饰器
  7. 大数据之-Hadoop之HDFS_Fsimage和Edits文件的解析---大数据之hadoop工作笔记0071
  8. 海思烧写工具需要java_HiTool(海思芯片烧录工具)下载
  9. wps word设置多级标题及对应目录
  10. mzy git学习,git推送到远程库(八)
  11. dropbox与public
  12. 微观计量经济学实证分析中的问题
  13. java正则表达式 问号_正则表达式问号的四种用法详解
  14. 能ping通百度,但是上不了网的解决方法
  15. NeuralCD--智能教育系统中的神经认知诊断
  16. Kafka+Scram认证+eagle管理
  17. HJ100 等差数列
  18. 鲍尔默:我当CEO时,微软对硬件研发投入真不够
  19. 分布式基础-常见分布式事务解决方案
  20. Maven 虐我千百遍,我待 Maven 如初恋 侵删

热门文章

  1. MIDDLEWARE 在传输大量数据时,经常会发生堵塞,如果有一条错误的数据整个队列将无法处理
  2. ABAP Pattern usage - define own custom user exit
  3. SAP GUI里Screen Painter的工作原理
  4. Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码 1
  5. SAP云平台的Document Service
  6. 8g内存一般占用多少_手记|如何设置虚拟内存
  7. python中name没有定义_python中__name__的使用
  8. Linux结构体变量报错,23. Linux模式设计
  9. java set 对象去重_JAVA对象去重
  10. python怎么复制上面的语句_JAVA、python、Go的复制语句