文章目录

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()