模块
模块是用表来实现的。
会有点像类的概念
例子:
modul={} 初始化
modul. 索引= 值 即声明了模块中的成员
function modul.func1() 即声明和定义了modul中的func1函数,有点像成员函数。
如果加了local,则外界无法访问。
加载:
使用require函数来加载模块。
require("<模块名>")
也可以给模块一个别名,即local a=require("afd")
接下里就可以用a了
加载路径:
搜索lua文件的路径 存放在 全局变量package.path ,
启动lua后,会用LUA_PATH来初始化
设置方式- 打开用户根目录下的.profile文件,对LUA_PATH进行设置
文件路径用;分隔,若是";;",即代表加上原来的路径
source ~/.profile 更新参数
如果是一个 *.LUA 的文件, 里面用到了自己写的库, 或者第三方写的库, 但是你不想把它放到 lua 的安装目录里, 则在代码里面可以指定require搜索的路径。
package.path = '/usr/local/share/lua/5.1/?.lua;/home/resty/?.lua;' --搜索lua模块
package.cpath = '/usr/local/lib/lua/5.1/?.so;' --搜索so模块
如果是要在 nginx.conf 文件中引用第三方的库,则需要在 http 段中添加下面的代码
lua_package_path '/usr/local/share/lua/5.1/?.lua;/home/resty/?.lua;';
lua_package_cpath '/usr/local/lib/lua/5.1/?.so;';
C 包
Lua和C是很容易结合的,使用C为Lua写包。
与Lua中写包不同,C包在使用以前必须首先加载并连接,在大多数系统中最容易的实现方式是通过动态连接库机制。
Lua在一个叫loadlib的函数内提供了所有的动态连接的功能。这个函数有两个参数:库的绝对路径和初始化函数。所以典型的调用的例子如下:
local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")
loadlib函数加载指定的库并且连接到Lua,然而它并不打开库(也就是说没有调用初始化函数),反之他返回初始化函数作为Lua的一个函数,这样我们就可以直接在Lua中调用他。
即调用f()后,我们才打开他。
如果加载动态库或者查找初始化函数时出错,loadlib将返回nil和错误信息。我们可以修改前面一段代码,使其检测错误然后调用初始化函数:
local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f() -- 真正打开库
一般情况下我们期望二进制的发布库包含一个与前面代码段相似的stub文件,安装二进制库的时候可以随便放在某个目录,只需要修改stub文件对应二进制库的实际路径即可。
将stub文件所在的目录加入到LUA_PATH,这样设定后就可以使用require函数加载C库了
错误处理
assert(判断条件, 错误信息)
如果判断条件为真,则啥也不做
否则就抛出错误信息
error可以终止当前正在执行的函数,并抛出错误信息和具体位置
error(错误信息, 指出错误位置应该是哪里)
用pcall包装处理错误时的代码
pcall(我们要执行的函数, 给这个函数所传入的参数)
当该函数没有错误时,返回true
当该函数有错误时, 返回false
调用了error就是发生错误
pcall是在销毁调用栈之后发送错误信息
xpcall是在销毁调用栈之前,发送错误信息,故可以得到更多
文件IO
简单IO
直接用io. 做操作
file = io.open()
io.input(file)
sr = io.read() --读到末尾时,sr为nil
file = io.open("abc,lua", "a") --追加模式,则偏移位置为最后
io.output(file)
io.write()
io.close(file)
这样子一次只能打开一个文件
io.read(参数X)
X为空时,读取一行
X为*n, 则读取一个数字
X为*a, 则从当前位置开始,读取整个文件而非一行
X为*i时, 读取下一行,而非当前行
X为一个整数时, 返回一个指定字符个数的字符串
完全模式
file = io.open()
接着不用io.
而是用file:函数
file:seek(位置, 距离), 则可以重定位文件位置
该位置为“set” "cur" “end” , 距离默认为0