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