lua使用笔记

类型

nil  空
​
boolean 只有false和nil是否,其他都是true
​
number对应c的double,新版有64位的整形 tonumber("100");转为number
​
string  tostring(100);
[[]]多行字符串赋值[[<html></html>]]
..拼接字符串
string.len(str)获取长度
string.sub(str,3,5)截取子字符串,下标从1开始
string.find(str,"num")查找,返回下标
string.gsub(str,"nuu","num")替换所有符合的内容

table

--map  
> a = {}
> a ={x=1,y=12}
> print(a.x)
1
--添加
> a.z=33
> print(a.z)
33

--数组
> tb={100,200,300}
> print(tb[1])
100
--末尾添加
> table.insert(tb,400)
> print(tb[4])
400
--在索引5处添加
> table.insert(tb,5,500)
​
--移除最后一项
> table.remove(tb)
400
> print(tb[4])
nil--遍历
for k,v in ipairs(tb) do
        print(k,v)
end
1       100
2       200
3       300
​
Table={name="airjronda",age=13}
print(Table["name"])--要带引号

 

 

字符串拼接

> print(1 .. 11)
111
> print(1 .. '1')
11
> print(1 .. 'sd')
1sd

 

转换

print(tonumber("12")+11)
23
print(tostring(13).."14")
1314

 

定义方法

function add(a,b) return a+b end
> c=add
> print(c(1,2))
3
c=nil

 

读文件

list=nil
path="D:/TARGET.txt";
--读取一行放在line,  line3->line2->line1->nil
for line in io.lines(path) do
    list={next=list,value=line}
    print(line)
endwhile list do
    print(list.value)
    list=list.next
end

 

局部变量

local a=100;--在文件里有效
在方法内时,
​
--全局变量不会释放,可以=nil来释放

 

逻辑控制

if

if a<b then
print(a)
end
--不等于
~=或not(a==b)
if a<b then
print(a)
elseif  a=b then
print(b)
else
print(b)
end

 

while

--先判断后执行
a=1;
while a<5 do
a=a+1
end
break退出循环

repeat

--先执行后判断
repeat
print(a)
a=a+1
until a<10

for

for i=1,10,1 do
    print(i)
end
​
​
t1={"one","two","three"}
--pairs遍历全部元素,ipairs只遍历连续的数组
for k,v in ipairs(t1) do
print(k,v)
end
[21:23:05] 1    one
[21:23:05] 2    two
[21:23:05] 3    three

函数

function add(a,b)
return a+b
end
​
add=function(a,b)
return a+b
end
--闭包函数
function newFun()
    local i=0
    return function()
        i=i+1;
        return i;
    end
end
​
a=newFun()
print(a())

 

尾调用

function a()
return 1
endfunction b()
    return a() --尾调用,最后一步调用了另一个函数
end

 

排序

network={
{name="jack",score="33"},
{name="lucy",score="32"},
{name="lucy",score="23"},
{name="shai",score="12"}
}
--从大到小
table.sort(network,function(a,b) return(a.score>b.score) end)
​
for k,v in ipairs(network) do
print(v.name,v.score)
end

内部API

dofie("test.lua");--执行lua文件
 

元表

index 如果是表,则在本表中查找key时,本表中没有此key,到index的表里找

如果是方法,则执行此方法,table和key可做参数

t1={id=123}
meta1={__index={age=12}}
​setmetatable(t1,meta1)
print(t1.age)--12


meta2={__index=function(table,key)
    print(table,key)
end}
setmetatable(t1,meta2)
print(t1.age)
--table地址 age
--nil

 

newindex 如果是表,给本表里设一个没有的key时,直接在newindex这个表里添加

t1={id=123}
t2={}
meta1={__newindex=t2}
setmetatable(t1,meta1)
t1.age=12
print(t1.age,t2.age)--nil 12

 

如果是方法,给本表里设一个没有的key时,会直接调用这个方法,新增的key,value可以作为参数

t1={id=123}
t2={}
meta2={__newindex=function(table,key,value)
    print(tostring(table).." add "..key..":"..value)
    rawset(table,key,value)--在表里添加
end}
setmetatable(t1,meta2)
t1.age=12
print(t1.age,t2.age)
--table: 01278AC8 add age:12
--12      nil

 

面向对象

self

t1={id=123}
function t1:getId()
  --谁调用谁就是self
return self.id; endprint(t1:getId())

 

继承

father={}
function father:faSay()
    print("faSay")
end
--自索引,自己作为自己的index
father.__index=father
​
son={}
function son:sonSay()
    print("sonSay")
end
--father设置为son的元表
setmetatable(son,father)
son.sonSay()
son.faSay()

 

new

userinfo={id="123",name="tom"}
userinfo.__index=userinfo
​
function userinfo:new(obj)
    obj=obj or {}
    setmetatable(obj,self)
    return obj
end
function userinfo:addAge(val)
    self.age=self.age+val;-- 如果没有age,先到userinfo里取age加法后设置给user2
end
user2=userinfo:new({id="323"})
print(user2.id)--323
print(user2.name)--tom
user2.name="jerry"
print(user2.name)--jerry

 

多重继承

userinfo={id="123",name="tom"}
​
function userinfo:new(obj)
    obj=obj or {}
    setmetatable(obj,self)
    self.__index=self
    return obj
end

 

私有化

function newUser()
    local member={
    id="12",
    age=12,
    name="adf"
    }
    
    local function getId()
        return member.id;
    end
    local function getAge()
        return member.age;
    end
    return {
        getId=getId,
        getAge=getAge,
        getName=function()
            return member.name;
        end
    };
end
users=newUser();
print(users.getId(),users.getAge(),users.getName())

 

协程

function getMoney(a,b)
​
    
    x,y,z=coroutine.yield(a*2,b*2,"100")--在这里挂起
    print(x,y,z)
    return x,y,z;
end
​
handle=coroutine.create(getMoney)
print(coroutine.status(handle))
​
print(coroutine.resume(handle,12,34))--阻塞,执行到yield,返回true,24,68,100
print(coroutine.status(handle))--挂起状态
print(coroutine.resume(handle,"a","b","c"))--将值传给x,y,z,返回true    a       b       c
print(coroutine.status(handle))--dead

 

交替执行

function fun1()
    while true do
        coroutine.resume(handle2)
        print("fun1---1")
    end
endfunction fun2()
    while true do
        print("xxxxxxxxx")
        coroutine.yield();--第一次到这返回,第二次从这后面继续
        print("fun2---2")
    end
end
​
handle1=coroutine.create(fun1)
handle2=coroutine.create(fun2)
coroutine.resume(handle1)

 

生产消费

function Product()
    local i=0;
    while true do 
        i=i+1;
        coroutine.yield(i);--将i返回
    end
endfunction Cast()
    while true do
        local res,n=coroutine.resume(handle1);
        print(res,n);--true i
    end
end
handle1=coroutine.create(Product)
handle2=coroutine.create(Cast)
coroutine.resume(handle2)

 

 
posted @ 2023-11-10 16:11  几个Ak  阅读(2)  评论(0编辑  收藏  举报