Lua学习笔记之模块



模块
require()  使用模块
module()  创建模块
通过require()来加载一个模块,返回一个全局变量table类型。
local a = require ”mod”
foo()


require 函数,搜索模块名时,使用一个 ’ ; ’ 分隔的路径。我遇到过一个加载路径的问题,最后得到的结论是:那一串路径中一般第一个:当前路径,是指运行lua脚本的当前位置,不是lua脚本所在的当前路径。通常,会直接到lua脚本所在的地方运行,但也有2个路径有不一样的时候。eg:/home/example/lua_test/test.lua 这是脚本所在路径,运行它时,我可以再/home/example/下面运行,此时test.lua脚本里面的require函数查找的是运行它的路径下模块文件。


编写模块
local modname = ...
local M = { }
_G[ modname ] = M
package.loaded[modname] = M  -- 就替代了本模块最后的return


M.i = { r =0 , i =1 }
M.f = function ( r , i )
  return { r = r , i = i }
end
当其他文件require这个模块的时候会传递文件名,那么文件名就传递进来作为参数命名这个模块了。


module函数:编写模块文件第一句。它的作用就是上面描述模块文件的开头几句,并且多加一句setfenv( 1 , M)将这个table设置为主程序块的环境。
module( ... , package.seeall)
package.seeall选项打开了访问外部(其他模块或者文件中的内容)。


记录一下:使用环境,”函数环境”技术
local modname = ...
local M = { }
_G[modname] = M
package.loaded[modname] = M
setmetatable( M , { __index =_G } ) --继承外部功能使用eg:io,math
setfenv( 1 , M )
以上就是module函数+package.seeall选项的实现过程


或者想要自己实现这个过程,并限制使用外部模块的一部分:
编写如下:
--模块设置
local modname = ...
local M = { }
_G[ modname ] = M
package.loaded[ modname ] = M


--导入段:声明本模块想要使用的外部模块功能作为本模块局部变量
local sqrt = math.sqrt
local io = io


--最后,设置模块的环境
setfenv( 1 , M )


以上


子模块:require加载时,用‘/’代替‘.’


另外,require加载模块时,最后会查找以参数命名的目录下的init.lua文件,来加载翻译。
eg:/usr/local/lua/?/init.lua

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值