Lua笔记

来源:互联网 发布:网络直播的受众群体 编辑:程序博客网 时间:2024/05/16 04:00

Lua中的数据类型:

         Boolean

         Number

         String

         Function

 

Print(type(“Hello world”))  àstring

Print(type(10*4.2))  ànumber

Print(type(print))  àfunction

Print(type(type))  àfunction

Print(type(nil))  ànil

Print(type(true))  àboolean

 

类型转换

A=”3”

Print(a+5) à8

Print(a..5) à35   

 

函数:

         --无参数无返回值函数
function funa()
    print("funa")
end

--有参数无返回值函数
function funb(a,b)
    print(a+b)
end

--有参数有返回值函数
function func(a,b)
    return a*b
end

 

--参数的默认值
function fund(a,b,c)
    a=a or 3
    b=b or 4
    c=c or 9

    print(a)
    print(b)
    print(c)
end

--不定参数
function fune(...)
    local a,b,c=...
    print(a)
    print(b)
    print(c)
    return select("#",...)--返回参数个数
end

function funf(...)
    for k,v in ipairs({...})
        do print(k,v)
end

 

 

运算符

1.      算术运算符

+ - * / % ^

 

a=7
b=2
c=math.floor(a/b)--向下取整
d=math.ceil(a/b)--向上取整
e=math.round(a/b)--四舍五入

 

 

 

2.      关系运算符(>,<,==,~=,>=,<=)

3.      逻辑运算符(and,or,not)

4.      三目运算符()

O= (a>b) and a or b   –>o=a>b? a:b

5.      连接运算符(..)

a..b

6. 长度运算符(#)

S=”hello”

Print(#s)

 

S={1,26,59,45,48}—注意nil  

Print(#s)

 

赋值语句

1.

A=”hello”..”world”

2.多值赋值

A,b,=10,2   à  a=10,b=2

 

变量个数>值的个数   按变量个数补足nil

变量个数<值的个数   多余的值会被忽略

A,b,c=0,1

Print(a,b,c)   à 0 1 nil

 

3.交换赋值

A,b=10,15

A,b=b,a

4.函数的多返回赋值

Functionfun(a,b)

         Return a+3,b*2

end

         a,b=fun(3,5)à a=6,b=10

 

局域变量和代码块

Local 本地变量

代码块

Do

         codes

end

 

分支语句

If a>b then

         Print(“a>b”)

Elseif a<b then

         Print(“a<b”)

Else

 Print(“a==b”)

 

循环语句

While…end 循环

Repeat…until循环相当于do…while

For…end循环

         Fori=1,10,2 do—从1到10,步长为2

                   Print(i)

         End

 

Lua中无continue,可以用repeat和if配套使用

 

Table(表)

包含数组,可变长数组,哈希表

1.      初始化

数组下标方式

A={3,5,7}—下标从1开始

Len=#A

Len=table.maxn(A)—准确求A的长度

键字对方式

A={x=3,y=5,z=”hello”}

A.     m=”mmm”

A[“n”]=”nnn”

Len=table.maxn(a)—len=0

Print(A.x)—

Print(A.n)

Print(“A[\”y\”]”..a[“y”])—

更一般的方式

B={[“+”]=”a”,[“-”]=”b”};

Print(b[“+”])

 

2.      求表长度

Len=#A

Len=table.maxn(A)—准确求A的长度

 

3.      二维数组

A={{1,2,3}{“aa”,”bb”,”cc”}}

A[3]={“张三”,”李四”,”王五”}

Len=table.maxn(A)—len=

InnerLen=table.maxn(A[1])

For i=1,len do

         Forj=1,InnerLen do

         Print(A[i][j])

         end

end

4.      表遍历

For k,v in next, T do—k为下标,v为值,T为表,nil不打印

         Print(v)

End

 

For k,v in ipairs(m) do—ipairs为关键字,只能把数组中的非空数值打印出

         Print(“i=”..k)

         Print(“v=”..v)

End

 

For k,v in pairs(m) do—pairs为关键字,可以输出全部键值

Print(“i=”..k)

Print(“v=”..v)

End

5.      数组元素的插入和删除

Table.insert(a,1,”AAA”)—在数组a的第一个元素位置插入AAA,其后元素往后顶

Table.remove(a,1)—删除数组a的第一个元素,后面元素往前移

插入删除不注明位置,默认在尾部,删除可以返回值

6.      编译和加载

.Dofile(“aa.lua”)—装载并执行

.File=Loadfile(“aa.lua”)—装载并编译成中间码,但不马上运行

Local fun=assert(file)

.f=loadstring(“function aa(a,b) return a+b end”)—字符串当匿名函数使用

f()    

num=aa(2,3)

print(num)—输出5

.require—会搜索路径加载文件,常用加载库

Require(“app.scenes.aa”)

7.      数组排序

a)        冒泡排序

b)        Table排序

Function tablesort()

         Table.sort(arr,function(a,b)return a<b end)—对数组arr排序

End

 

字符串操作

a)      字符串查找(返回找到的起始位置)

_start,_end=string.find(s,’ah’)—注意:lua里面数组或者字符串的字符,其下标都是从1开始的

_start,_end=string.find(s,’ah’,5)—从字符串的第五个位置开始查找

b)      字符串替换

A=”one string”

B=string.gsub(a,”one”,”another”)—把A的字符串的one替换成another

 

c)      多行字符串

Function manyline()

Page=[[

           <html>

                    <title></title>

                    <body>

                             Hello,world

                    <body>

           </html>

]]       

end

d)      字符串拼接

..

e)      转换字符串

字符串会在string类型和number类型间自由转换

f)       字符串倒序

S=”hello”

S=string.reverse(s)

 

         随机数

                   Math.randomseed(xx)—添加种子数

Math.random([n[,m]])—提取随机数,取n到m间的随机数

 

Function getRand(a,b)—伪随机数

         Math.randomseed(1)—可以使用os.time()获取 当前系统时间,使种子数不同

         For i=0,10 do

                   Num=math.random()—0—1间随机取值

         end 

end

 

mytime=os.time()

mytime=string.reverse(mytime)

math.randomseed(mytime)

math.random(1,10)

 

Math库

         Math.pi

         Math.abs(-15)=15—取绝对值

         Math.ceil(5.8)=6—向上取整

         Math.floor(5.5)=5—向下取整

         Math.round(5.5)=6—四舍五入

         Math.mod(14,5)=4—取模

         Math.max()—取最大值

         Math.min()

         Math.rad(180)=3.14159265358—取弧度

         Math.deg(math.pi)=180—取角度值

         Math.power()—平方

         Math.sqrt()—开方

         math.atan2(y,x)—得到角弧度值

 

文件操作

         File,msg=io.opern(“iter.lua”,”r”)—r:read,w:write删除重新写,a:add,r+,w+,a+

         File:write(“helloworld”)

        

         File:read(“*line”)—读取一行,*all读取所有

 

例外处理

         FuctionerrorFun()

         S=”5”

         Ifnot tonumber(s) then

                   Print(“不是数字”)

         Elseprint(“是数字”)

         End

End

 

Function exceptionFun(str)

         If(str~=”dd”)then

                   Error(“这不是我要的字符”)

         End

         Return“这是我要的字符”

End

 

S,err=pcall(exceptionFun,”rr”)—pcall执行,返回值交给err,

 

协同程序

         协同程序就和线程差不多,但是又有比较明显的区别。

         协同程序和线程都是在任意时刻都只能执行一个,但概念不一样。

         一个协同程序在运行的时候,其他协同程序是无法获得执行的机会的,只有正在运行的协同程序主动挂起时,其他协同程序才有机会执行。

         而对于线程而言,即使不主动休眠,也很有可能因为轮片时间到达而把执行机会让给其他线程。

         FunctioncorutineFun()—coroutine协同程序

                   Localco= coroutine.creat(function(a,b)—传入参数的协同,但是参数只能初始化传入的有效

         For i=1,10 do

                  Print(a+b)

                   Coroutine.yield()—挂起

         End

end 

)

Return co

         end

 

         coroutine.resume(co,3,5)—调用协同线程

         print(coroutine.status(co,6,9))—输出协同状态

        

 

闭包

         闭包是函数中的函数,可以包含父函数的局部变量的代码块,可以让这些局部变量的值始终保持在内存中。

         它的最大的用处有两个,一个是可以读取函数内部的变量,另一个是让这些变量的值始终保持在内存中。

         Functionfunc(a)

                   Localii=a

                   Functionff()—闭包

                            ii=ii+1       

                            print(ii)

                   End

         Returnff

         End

 

         --调用

         Localfun=func()

         Fun()

 

面向对象

         Tolua++是一个三方的软件包,可以为lua提供面向对象的方法

         封装

                   LocalUser= class(“User”)

                            User.id=1

                            User.name=”Shiwazone”

                            User.age=20

 

                            FunctionUser:ctor()

                                     Print(“Userconstruction!”)

                            End

 

                            Function User:ctor(name)---lua不支持重载,默认使用下最后一个同名的函数

                                     User.name=name   

                                     Print(“Userconstruction!”)

                            End

 

                            FunctionUser:fun()

                                     Print(“User’sfun”)

                            End

 

                            FunctionUser:SetID(id)

                                     Self.id=id—使用对象的数据

--User.id=id-- User.id为静态变量,其值被所有对象使用

                            End

 

         FunctionUser:GetID(id)

                                     --ReturnUser:id

                                     Returnself:id

                            end

 

                   ReturnUser

 

                   LocalclassUser=require(“…User”)

                  

                   Localuser=classUser.new()

                   print(user.name)      ---Shiwazone   

                   user.name=”Tingmao”

                   print(user.name)               --Tingmao

 

                   user:setID(23)—用冒号访问表示调用自己的成员函数,用点访问相当于调用静态函数

                   print(user:getID())

 

          

        

继承(单)

         LocalUser=require(…User)

         LocalTeacher=class(“Teacher”,User)—继承User

                  Function Teacher:ctor()

                            Self.Super:ctor()—调用父类构造函数

                            Print(“Teacherconstruction”)

                   end

         ReturnTeacher

 

Local classTeacher=require(“…Teacher”)

 

 

Lua Table 知识点

         Localarray={1,2,3,4,5,6}

         Print(#array)---6

         Print(table.maxn(array))—6

 

         Array[7]=7

         Print(#array)---7

         Print(table.maxn(array))—7

 

         Array[9]=9

         Print(#array)---7

         Print(table.maxn(array))—9

 

         Array={}

         Array[1]=2

         Array[“1”]=2

         Print(#array,array[1],array[“1”])—11 2

Account = {balance = 12}

Function 

0 0