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源代码