lua
- luajit
- lua xxx.lua
- lua -i 交互式
- #!/usr/local/bin/lua
- https://www.runoob.com/manual/lua53doc/contents.html
语法
- –单行注释
- –[[ 多行注释 –]]
- 动态类型,直接定义变量, 变量默认全局, 删除变量使用 xxx=nil, 局部local xxx=10 a,b=10,11, a,b=b,a
- 类型:nil boolean number(双精度) string function userdata(c结构) thread table
- type(x) == nil ->false type(x) == “nil” ->true
- false nil 都为 false, 其他都是true 0也是true
- string “xxx” ‘xxxx’ [[xxx xxx xx]] “2”+6=8.0 “2”+”6”=8.0 “2” .. “6”=”26” 2 .. 6=”26”
- string #”xxxx”=4
- table {} xx={“a”, “b”} xx[1]==”a” xx[“c”]=8 xx.c==8 xx.1==”a”
- function xxx(a, b) … end xx=function(a, b) … end
- while(xxxx) do … end
- for var=begin, end, step(1) do … end 三个值一次性求值
- for index, value in ipairs(table) do … end
- repeat … until(xxx) xxx=true 停止 false 继续
- 循环都支持break goto
- if() then … elseif() then … else … end
-
^幂次方 not -负 * / % + - .. == ~=不等 > < >= <= and or - 模块 将public变量、函数等存储在table中并return table require(“table名”)
- setmetatable getmetatable 为table定义额外的方法
语法例子
-- 面向对象
className = {proto = 0}
function className:new(o, proto)
o = o or {}
setmetatable(o, self)
self.__index = self
self.proto = proto or 0
return o
end
function className:print()
print(self.proto)
end
local cobj = className:new(nil, 10)
cobj:print()
subClassName = className:new()
subClassName[side] = 0
function subClassName:new(o, proto)
o = o or className:new(o, proto)
setmetatable(o, self)
self.__index = self
return o
end
function subClassName:printArea()
print(self.side * self.side)
end
function subClassName:print()
print("sub class:" .. self.proto)
end
local function local_func(arg1, arg2, ...)
for i, v in ipairs(...) do
end
print("总共传入 " .. select("#", ...)+2 .. " 个数")
arg = select(3, ...) 取第三个元素
print(select(3, ...)) 打印第三个元素及后面的元素
array = {...}
for i, v in ipairs(array) do
end
print("总共传入 " .. #array + 2 .. " 个数")
array={}
array[0]={}
array[0][0] = xxx
return "ok", 0
end
function square(max, index)
if (index < max) then
index = index + 1
return index, index * index
end
end
for i, num in square, 10, 0 do
print(i, num) -- 1 1 2 4 3 9 ..... 10 100
end
function element(array)
local index = 0
local total = #array
return function()
index = index + 1
if index <= count then
return array[index]
end
end
end
array={"1", "2", "3", "4"}
for item in element(array) do
print(item) -- 1 2 3 4
end
table.concat(array) -- "1234"
table.concat(array, ", ") -- "1, 2, 3, 4"
table.concat(array, ", ", 2) -- "2, 3, 4"
table.concat(array, ", ", 2, 3) -- "2, 3"
table.insert(array, "5") -- {"1", "2", "3", "4", "5"}
table.insert(array, 2, "5") -- {"1", "5", "2", "3", "4"}
print(table.remove(array)) -- "5"
print(table.remove(array, 1)) -- "1"
table.sort(array)
table.sort(array, function)
[[ package.path=LUA_PATH=xx/xx/?.lua;xx;
package.cpath=LUA_CPATH=xx/xx?.so;
]]
rquire("module")
module.xxxx
local md = rquire("module")
md.xxxx
local common_init = loadlib("/xx/xx/xx.so", "common_init")
common_init()
local t1 = setmetatable({},{})
local tm1 = getmetatable(t1)
tm1[__index] = function(t, key)
if key == "key" then
return 3
elseif key == "value" then
return 4
end
return nil
end
print(t1.value) -- -> 4
tm1[__newindex] = function(t, key, value)
print("to set new key=" .. key ..)
rawset(t1, key, value)
end
t1[1] = "a" -- to set new key=1
t1[1] = "b" --
-- +=__add -=__sub *=__mul /=__div %=__mod 负号=__unm ..=__concat ==__eq <__lt <=__le
tm1[__add] = function(t, ot)
for k, v in ipairs(ot) do
if t[k] == "nil" then
t[k] = v
end
end
return t
end
t1 = t1 + xx
tm1[__call] = function(t, ot)
...
end
t1(xxxx)
tm1[__tostring] = function(t, ot)
...
end
print(t1)
assert(xx, "msg")
error("msg", 1) -- 1打印文件及行号 2打印调用堆栈
if pcall(func, param...) then
print("没错误")
else
print("错误")
end
xpcall(function(i) print(i) end, function() print(debug.traceback())end, 33)
协程
function xx(x)
print(x)
end
co = coroutine.create(xx)
co = coroutine.create(function(x)
print(coroutine.status(co)) -- running
print(coroutine.running()) -- thread:1234
coroutine.yield()
print(x)
end)
coroutine.resume(co, "hello coroutine") -- running thread:1234
print(coroutine.status(co)) -- suspended
coroutine.resume(co) -- hello coroutine
print(coroutine.status(co)) -- dead
文件读写
file = io.open("test.txt", "r") -- r w a r+ w+ a+ b +
io.input(file)
print(io.read()) -- 打印第一行
print(io.read("*l")) -- 读下一行 EOF返回nil
print(io.read("*n")) -- 读一个数字
print(io.read("*a")) -- 从当前位置读取所有数据
print(io.read(100)) -- 读取100个字符,EOF返回nil
io.close(file)
file = io.open("test.txt", "a")
io.output(file)
io.write(" xxxx ")
io.close(file)
file = io.tmpfile() -- 打开一个临时文件
io.type(file) -- 文件句柄是否可用
io.flush()
print(file:read()) -- 打印第一行
file:write(" xxx ")
file:seek("set"|"cur"|"end", 10) -- 开始\当前\末尾 默认偏移0
file:seek() -- 当前位置
file:close()
for line in io.lines("main.lua") do
print(line) -- 每次打印一行
end
调试
debug(): --开启交互式调试
cont --结束调试
debug.getfenv(object) -- 返回对象的环境变量。
debug.gethook([oc]) -- oc协程 默认当前, 返回当前钩子函数、当前钩子掩码、当前钩子计数
debug.getinfo([oc], f|deep) -- 函数名 或 栈深度 1 当前函数
debug.getlocal([oc], deep, n) -- 返回deep深度函数的第n个局部变量及值
debug.getmetatable(value) -- 将value压栈
debug.getregistry() -- c保存的lua值
debug.getupvalue(f, n) -- 返回函数的第n个变量及值
debug.sethook([oc], hook, c, [count]) -- 每次调用一个函数时调用hook, 最多count次
debug.sethook([oc], hook, r, [count]) -- 每次从一个函数返回时调用hook, 最多count次
debug.sethook([oc], hook, l, [count]) -- 每执行一行都调用hook, 最多count次
debug.setlocal([oc], level, n, value) -- 设置函数的第n个局部变量
debug.setmetatable(value, table) -- 设置变量为一个table
debug.setupvalue(f, n, value) -- 设置函数的第n个变量
debug.traceback([oc], ["msg", [deep]])
内存GC
collectgarbage("collect") -- 一次完整的gc
collectgarbage("count") -- 使用的总内存Kb
collectgarbage("restart") -- 重启垃圾回收自动运行
collectgarbage("setpause", 100) -- 等于当前使用的总内存时开始回收, 200当前两倍
collectgarbage("setstepmul", 10) -- 每增加上次最大值的10%时
collectgarbage("step", 3) -- 3步完成GC
collectgarbage("stop") -- 停止自动GC
C接口
#include <lua.h>
#include <lauxlib.h>
#define LUA_USE_APICHECK 1 //编译lua引擎时打开C接口API参数检查
#define LUA_MINSTACK 20 //默认lua与C交互参数及返回值的栈大小
void lua_close (lua_State *L);
int lua_checkstack(lua_State *L, int n);
void lua_createtable (lua_State *L, int narr, int nrec);