lua

lua

Posted by nomadli on October 28, 2021

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