一、Lua错误处理
-
错误类型:语法错误、运行错误。
-
错误处理:
-
assert()函数:
-
功能:检查第一个参数是否为true,如果不为true则将第二个参数作为错误信息抛出。
-
示例:
-
function add(a, b)
-
assert(type(a) == 'number', 'a is not a number.')
-
assert(type(a) == 'number', 'b is not a number.')
-
return a + b
-
-
end
-
-
-
error(message [, level])函数:
-
功能:终止正在执行的函数,并返回message作为错误信息。
-
level参数:
-
level = 0: 不添加错误位置信息。
-
level = 1: 显示调用error的位置(文件名+error所在的行号)。默认值为1.
-
level = 2: 显示调用error的函数的调用位置(文件名+调用error的函数所在的行号)。
-
-
-
pcall(), xpcall(), debug
-
二、Lua调试(Debug)
三、Lua垃圾回收
-
Lua采用了自动内存管理。Lua中所有用到的内存,如:字符串、表、用户数据、函数、线程、内部结构等,都服从自动管理。
-
垃圾收集器间歇率:
-
采用百分制(值100在内部表示为1)。
-
作用:控制收集器在开启新的循环前需要等待多久。
-
说明:
-
增大这个值会减少收集器的积极性。
-
该值小于100时,收集器在开启新的循环时,不会等待;
-
该值为200时,收集器会等到总内存使用量,达到之前的两倍时,才开启新的循环;
-
-
-
垃圾收集器步进倍率:
-
采用百分制(值100在内部表示为1)。
-
作用:控制收集器运作速度相对于内存分配速度的倍率。
-
说明:
-
增大这个值会增加收集器的积极性;而且会增加每个增量步骤的长度;
-
该值小于100时,收集器工作速度太慢,以至于永远干不完一个循环;
-
该值为200时,表示收集器以内存分配的两倍速工作;
-
-
-
垃圾回收器函数 collectgarbage ([opt [, arg]])用来控制自动内存管理 :
-
collectgarbage('collect'): 做一次完整的垃圾收集循环;
-
collectgarbage('count'): 返回Lua所使用的内存总量(单位: Kb);
-
collectgarbage('restart'): 重启垃圾收集器的自动运行;
-
collectgarbage('setpause'): 将arg设置为垃圾收集器间歇率,并返回上一个值;
-
collectgarbage('setstepmul'): 返回步进倍率的前一个值;
-
collectgarbage('step'): 单步运行垃圾收集器;
-
collectgarbage('stop'): 停止垃圾收集器的自动运行;通过collectgarbage('restart')可以重启垃圾收集器的自动运行;
-
四、Lua面向对象
五、Lua数据库访问
-
luaSQL:
-
开源库。
-
lua数据库的操作库。
-
支持的数据库:ODBC、ADO、Oracle、MySQL、SQLite和PostgreSQL。
-
-
LuaRocks:
-
作用:
-
lua的模块管理工具:可以安装和更新lua的第三方模块。
-
使用某种数据库(如: sqlite3)前,需要安装其数据库驱动,可以使用luarocks安装所需的数据库的驱动。
-
-
安装:
-
http://luarocks.org/releases/ 页面选择需要的软件包。
-
./configure --prefix=/usr/local/luarocks
-
make && make install
-
-
使用:
-
sudo luarocks install luasql-sqlites
-
说明:
-
上述指令运行完成后,在/usr/local/luarocks/lib/lua/5.3/luasql目下安装了sqlite3.so文件。
-
创建软链接:sudo ln -s /usr/local/luarocks/lib/lua/5.3/luasql/sqlite3.so /usr/local/lib/lua/5.3/luasql/sqlite3.so后,在lua文件中通过require "luasql.sqlite3",可以成功加载sqlite3数据库驱动。
-
-
-
-
sqlite3数据库使用示例:
-
sqlite3 = require "luasql.sqlite3"
-
env = sqlite3.sqlite3()
-
db = env:connect("./test.db")
-
db:execute [[DROP TABLE people]]
-
db:execute [[CREATE TABLE people(name varchar(10), age int(3))]]
-
db:execute [[INSERT INTO people(name, age) values('lfc', 28)]]
-
db:execute [[INSERT INTO people(name, age) values('mzh', 29)]]
-
cur = db:execute [[SELECT * FROM people]]
-
colnames = cur:getcolnames()
-
coltypes = cur:getcoltypes()
-
for k, v in pairs(colnames) do print(k, v) end
-
for k, v in pairs(coltypes) do print(k, v) end
-
function rows(cur)
-
return function(cur)
-
local tt = {}
-
ret = cur:fetch(tt, 'a')
-
if (nil ~= ret) then
-
return tt
-
-
else
-
return nil
-
-
end
-
-
end, cur
-
-
end
-
for tt in rows(cur) do
-
for k, v in pairs(tt) do print(k, v) end
-
-
end
-
cur:close()
-
db:close()
-
env:close()
-
参考:https://www.cnblogs.com/windtail/archive/2012/01/08/2623191.html
-
-
依赖库
-
lua:
-
libreadline6
-
libreadline6-dev //需要<readline/readline.h>
-
-
luarocks:
-
安装sqlite3数据库驱动前需要首先安装sqlite3:
-
sqlite3
-
libsqlite3-dev //需要sqlite3.h
-
-
-