Lua学习笔记

lua八种数据类型:nil、number、string、boolean、table、userdata、function、thread

---[[
--协程
function f2(  )
    for i =0,9 do
        local res,v1,v2 = coroutine.resume( c1,i,i+1 )
        print("c2",v1,v2)
    end
end
c2 = coroutine.create(f2) 
function f1(  )
    while true do
        local v1,v2 = coroutine.yield(300,100 )
        print("c1",v1,v2)
    end
end
c1 = coroutine.create(f1)
coroutine.resume( c2 )
--]]

for范型编程

list模版、建立链表、迭代器

--建链表
list = nil
for k,v in ipairs(tab) do
    list = {val = v,next = list}
    print(list.val)
end
--迭代函数
function ipairs_iter( t,node )
    if node ==nil then 
        return t
    else 
        return node.next
    end
end
--迭代入口
function ipairs_list( t )
    return ipairs_iter,t,nil
end
--遍历链表元素
for node in ipairs_list(list) do
    print(node.val)
end
--删除链表元素
function deletenode( list,val )
    for node in ipairs_list(list) do
        if node.next ~=nil and node.next.val == val then
            local p = node.next
            node.next = p.next
            p.next=nil
        end
    end
end
deletenode(list,3)
for node in ipairs_list(list) do
    print(node.val)
end


队列和双向队列

---[[
--队列和双向队列
queue = {}

function queue.new()
    return {first = 0, last = -1}
end

function queue.pushFront(queue, value)
    local first = queue.first -1
    queue.first = first
    queue[first] = value
end

function queue.pushBack(queue, value)
    local last = queue.last +1
    queue.last = last
    queue[last] = value
end

function queue.popFront(queue)
    local first = queue.first
    if first > queue.last then
        error("queue is empty")
    end
    local value = queue[first]
    queue[first] = nil
    queue.first = first +1
    return value
end

function queue.popBack(queue)
    local last = queue.last
    if queue.first > last then
        error("queue is empty")
    end
    local value = queue[last]
    queue[last] = nil
    queue.last = last -1
    return value
end

que = queue.new()
queue.pushFront(que,4)
queue.pushFront(que,2)
queue.pushFront(que,3)
--遍历
for i= que.first,#que do
    print(que[i])
end
print(queue.popBack(que))
print(queue.popFront(que))
print(queue.popBack(que))
--print(queue.popBack(que))
--]]

stack = {}
stack.__index = stack

function stack:new()
    local o = {}
    setmetatable(o, stack)
    stack:init()
    return o
end

function stack:init()
    self.stackList = {}
end

function stack:clear()
    self.stackList = {}
end

function stack:reset()
    self:init()
end

function stack:pop()
    if #self.stackList == 0 then
        return 
    end

    -- table.remove缺省的情况下删除最后一个参数
    return table.remove(self.stackList)
end

function stack:push(x)
    table.insert(self.stackList,x)
end

function stack:size()
    return #self.stackList
end

return stack

元表

---[[
--元表
a={1,2,3}
b={4,5,6}
meta = {}
meta.__add =function ( a,b )
    local res={}
    for i = 1, #a, 1 do
        res[i]=a[i]+b[i]
    end
    return res
end
--设置元表
setmetatable(a,meta)
setmetatable(b,meta)
result = a+b
for i = 1, #result, 1 do
    print(i,result[i])
end
window = {x=0,y=0,width=100,height=200}
mywindow={}
--用__index实现继承
window.__index = function(t,key)
    return window[key]
end
setmetatable(mywindow,window)
print(mywindow.width)
--不使用继承
print(rawget(mywindow,width))
--]]

类、继承

--[[
--类
CPeople = {name ="default name",age = 10,sex = "fale"}
function CPeople.new( p,o )
    o = o or {}
    setmetatable(o,p)
    p.__index = p
    return o
end
function CPeople.Walk(  )
    print("walk")
end
function CPeople.Say(  )
    print("say")
end
function CPeople.Print(p)
    print(p.name,p.age,p.sex)
end
local p1=CPeople.new(CPeople,{name="zhangsan",age=10,sex="fale"})
p1.Walk()
p1.Say()
p1.Print(p1)
--]]
--[[
--类
--优化写法
CPeople = {name ="default name",age = 10,sex = "fale"}
--不需要传参数,因为使用默认self
function CPeople:new(o)
    o = o or {}
    setmetatable(o,self)
    self.__index = self
    return o
end
function CPeople:Walk(  )
    print("walk")
end
function CPeople:Say(  )
    print("say")
end
function CPeople:Print()
    print(self.name,self.age,self.sex)
end
local p1=CPeople:new({name="zhangsan",age=10,sex="fale"})
p1:Walk()
p1:Say()
p1:Print(p1)
--]]
--[[
--继承
--优化写法
CPeople = {name ="default name",age = 10,sex = "fale"}
--不需要传参数,因为使用默认self
function CPeople:new(o)
    o = o or {}
    setmetatable(o,self)
    self.__index = self
    return o
end
--继承
CMale={}
function CMale:new(o)
    o = o or {}
    setmetatable(o,self)
    self.__index = self
    setmetatable(self,CPeople)
    CPeople.__index = CPeople
    return o
end
--重写
function CMale:Walk()
    print("CMale walk")
end
function CPeople:Walk(  )
    print("walk")
end
function CPeople:Say(  )
    print("say")
end
function CPeople:Print()
    print(self.name,self.age,self.sex)
end
local p1=CPeople:new({name="zhangsan",age=10,sex="fale"})
p1:Walk()
p1:Say()
p1:Print()
local p2=CMale:new({name="lisi",age=20,sex="male"})
p2:Walk()
p2:Say()
p2:Print()
--]]

C与Lua调用

记得出栈

封装后:

lua_pcall(lua_State *L,int nargs,int nresults,int errfunc)

  • nargs 参数个数
  • nresults 返回值个数
  • errFunc 错误处理函数,0表示无,表示错误处理函数在栈中的索引

示例:

--test.lua
function test(x,y)
    return x + y
end
lua_loadfile(L,"test.lua");

--调用
lua_pushnumber(L,10);   --x 值入栈
lua_pushnumber(L,20);   --y 值入栈
lua_pcall(L,2,1,0);

Lua调用C

入栈API函数:

将C中的压入栈,Lua调用

将C中的压入栈,Lua调用

将C中的函数压入栈,Lua调用

lua调用C函数时传入参数

void *lua_newuserdata (lua_State *L, size_t size);

lua_newuserdata 函数按照指定的大小分配一块内存,将对应的 userdatum放到栈内,
并返回内存块的地址。

out文件的字节码可以反编译得到lua源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值