文章目录
1993
年开发,解释器200k
.所有脚本语言中速度最快的.
可以完美的与C/C++
交互.
http://www.lua.org/pil/contents.html
https://github.com/LewisJEllis/awesome-lua
https://github.com/bdellegrazie/lualdap
Basic
^
: 乘幂#
: 字符或table的长度(数组部分,必须从1开始且连续!不从1开始视为nil,不记录长度!)..
: 字符串连接~=
: !=
types
string
: 单引号或双引号或[[raw-string]]
number
: double
table
数组+哈希. 分开存放! 遍历的时候先遍历数组,索引从1
开始.
key
必须是string
! table
中不要使用nil
(获取维度的getn
及#
遇到nil即终止)!
Demo
module = {}
require('module1') -- 使用模块,搜索顺序:~/lua;./;/usr/local/share/lua/..;/usr/local/lib/lua/...
return module.function1 -- export本模块定义的函数
print(123 .. 456) -- '123456',自动转换为字符串concatinate
T = { -- 定义并初始化一个table,属性可以在后面随时添加 .可模拟类.
[1] = 'hello', -- t[1]
key1 = 'value', -- t.key1 == t['key1'], 字典:key只能是string!
func1 = function()..., -- 后面多加一个逗号不影响getn和#.
}
function T:func2(p) -- 也可写成T.func2(self,p)
self.key1 = p
end
table.remove(t,1) -- pop,默认删除最后1个元素(数组部分),返回被删除的那个元素.
table.insert(t,1,value) -- 在头部插入,默认(省略第2个参数)插入到数组尾部.
table.concat(t,[sep],[start,end]) -- 以sep(默认空)连接他们,变为字符串!
table.sort(t,[comp]) -- 对t的数组部分的value升序排序(适用于字符串).function comp(a,b)...
table.maxn(t) -- t中索引>=1的数组的元素个数.
table.getn(t) -- 同#.想要知道table的元素个数必须使用pairs循环!
table.setn(t, 8) -- 预留数组大小,getn会获取该处的8.
table.pack('1','2') -- {1:'1', 2:'2', n:2}
a,b = table.unpack(t)
table.foreach(t, function(i,v)) -- 遍历table中的数组,不加i后缀是遍历所有元素.
-- string
string.upper(s)/lower(s)/reverse()/format()/len()
string.byte('CBA', -1) -- 65; 默认是1即第1个元素!
string.char(97,98) -- ab
string.find('CB.A', '%.', 1) -- 注意:%相当于\.返回的是俩个索引[star,end];默认就是从索引1开始,也可不用指定1!
string.sub('CB.A', 1, -1) -- 默认就是-1,即取到最后一个
string.gsub('aaaaa', 'aa', 'z', 2); -- zza 2,共替换两次
string.rep('abc', 2) -- abcabc
string.match('a 2 hello', '%d+ %a+') -- 2 hello, 第3个参数默认是1,从开头开始寻找
for word in string.gmatch('hello world', '%a+') do
-- .(任何字符,%用来转义) %a(任何字母,%l小写,%u大写) %d(任何数字) %w(%a+%d) %z(任何代表0的字符) %p(标点) %s(空白字符) %c(控制字符如\n)
-- [%w_] :与任何字母数字或下划线匹配
-- [^%s] :与任何非空白字符匹配,其实大写都是取反: == %S
-- - :同*,但尽可能少的匹配.
-- %n :1-9,表示匹配第n个子串.
-- %b() :匹配括号平衡的表达式
end
-- function
-- 语言层面支持多返回值: 返回多个逗号分隔的值,他们并不构成什么类型.
function module.fractorial(n, ...)
local args = { ... } -- #args:实参个数的字符串
assert(type(n) == 'number', 'n不是一个数字')
if n >= 0 then
elseif n ~= -1 then
end
for i=1,8 do
-- i具有local属性! 索引从1开始! step默认是1,即1,8,1
-- while (condition) do ... end
-- repeat ... until(condition)
end
for k,v in pairs(table1) do
-- k,v具有local属性! 先遍历数组部分,再按照key的hash顺序遍历字典部分!
-- ipairs :只遍历数组部分,注意:碰到不连续的(中间穿插key)会断开!
end
end
-- coroutine
co = coroutine.create(
function () -- 匿名函数
coroutine.status(co) -- dead/suspend/running,此处是running
coroutine.yield()
end
)
coroutine.resume(co, 2) -- 启动协程,传递参数2
-- io
io.tmpfile() -- 程序结束时自动删除
file = io.open('test.lua', 'w')
file.seek('set', 0) -- 默认where=cur,offset=0
file.read() -- 读取一行==read('*|'),若已在EOF处则返回nil! *a:当前位置到最后; *n:读取一个数字并返回; read(5):读取五个字符
file.write('--comment') -- 在文件最后一行追加
file.flush();
io.type(file) -- 检测file是否是一个文件句柄
io.close(file)
for line in io.lines(filename) do
-- 到EOF时返回nil,并自动close.
-- 不带参数时读取默认输入设备的内容,但结束时不关闭文件
end
-- luasql
luarocks install luasocket
luarocks install luamysql
require('luasql.mysql')
env = luasql.mysql()
conn = env:connect('dbname', 'user', 'pwd', 'ip', port)
cur = conn:execute('select * from role')
row = nil
repeat
row = cur:fetch(row, 'a')
until(not row)
conn:close()
env:close()