局部变量和全局变量
Lua中定义变量不用给它定义类型,赋值的是什么类型就是什么类型。
Lua中代码结束不用分号结束。
类型判断和类型转换
nil类型:Lua中特殊的类型,一个全局变量没有被赋值前的默认值为nil;给全局变量赋nil可删除该变量。
boolean: 布尔类型
number: 数字类型
string: 字符串类型
function: 函数类型
Lua中的类型转换比较灵活,能够自动判断类型进行相加。
函数
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
funf("a","b","c",5,7)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
function funf( ... )
for k,v in ipairs({...}) do
print(k,v)
end
end
return LuaLessonOne
运算符
(1)算术运算符:±*/^(加减乘除幂)
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a = 7
b = 2
c = a/b
d = math.floor(a/b)--向下取整
e = math.ceil(a/b)--向上取整
f = math.round(a/b)--四舍五入
g = a%b --取余
h = 3^3
print(c)
print(d)
print(e)
print(f)
print(g)
print(h)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
(2)关系运算符
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a = 7
b = 2
c = "2"
print(a==b)
print(a~=b)--不等于
print(a>=b)
--print(a>=c)会出错
print(a~=c)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
(3)逻辑运算符
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
--and,or,not
print(true and true)
print(true and false)
print(true and false and true)
a,b,c = 5,6,7
print(a<b and b<c)
print(true or false)
print(false or false)
print(not (a>b))
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOn
(4)三木运算符,连接运算符,长度运算符
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
--三木运算符
a,b,c = 5,6,7
o = (a>b) and a or b --如果a>b成立,则o= a,否则o = b
print(o)
--连接运算符
print(a..b)
--长度运算符
s = "hello"
print(#s)
d = {3,5,8,nil,9}
print(#s)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
基本语法
(1)赋值语句
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
--多值赋值
--a变量个数>值的个数,按变量个数补足nil
a,b,c = 10,15
print("a="..a..",b="..b)
print(c)
--b变量个数<值得个数,多余的值会被忽略
d,e = 2,3,4
print("d="..d.."e="..e)
--交换赋值
a,b = b,a
print("a="..a..",b="..b)
--函数多返回赋值
f,g = fun(3,4)
print("f="..a..",g="..b)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
function fun(a,b)
return a+3,b*2
end
return LuaLessonOne
(2)代码块
require("app.scenes.aa")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a,b = fun(3,4)
print("a="..a.."b="..b)
do --do end相当于把之间的代码封装起来,里面的值只能里面使用
local a = 3
print("内部a="..a)
end
print("外部a="..a)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
function fun(a,b)
return a+3,b*2
end
return LuaLessonOne
分支语句
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a,b,c = 3,5,7
if a>b and c>d then
print("a>b")
elseif ((a<b) and (c>b)) then
print("a<b")
else
print("a=b")
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
循环语句
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
print("-----while----")
a,b = 3,9
while a<b do
print(a)
a = a+1 --在Lua中a++,++a,a+=等等都是不允许的
end
print("-----repeat----") --类似于do while,先进入循环再判断
a = 3
repeat
print(a)
a = a+1
until a>b
print("-----for----")
for i =1,5,1 do --1到5循环,最后一个是步长
print(i)
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
Table
(数组方式声明)
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a = {3,5,7,nil,"a","b","c",nil} --注意,Lua中数组的下标从1开始,而不是0
lena = #a
print("lena = "..lena)
for i=1,lena do
print(a[i])
end
print("------")
b = {3,5,7,nil,"a","b","c",nil}
lenb = table.maxn(b)
print("lenb = "..lenb)
for j=1,lenb do
print(a[j])
end
print("------")
c = {3,5,7,nil,"a","b","c",nil}
c[10] = 34
lenc = table.maxn(c)
print("lenc = "..lenc)
for s=1,lenc do
print(a[s])
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
(键值对方式声明)
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a ={x=3,y=5,z="hello"} --x是键,3是值
len = table.maxn(a)
a["n"] = "nnn"
print("len = "..len)
print("a.x = "..a.x)
print("a[\"y\"]="..a["y"])
print(a.n)
b = {["+"] = "a",["-"] = "b"}
print(b["+"])
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
二维数组
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a = {{1,2,3},{"aa","bb","cc","dd","ee"}}
a[3] = {"张三","王五","李四"}
len = table.maxn(a)
for i = 1,len do
innerlen = table.maxn(a[i])
for j = 1,innerlen do
print(a[i][j])
end
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
表遍历
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a = {3,5,7;nil,x=3,y=5,z="hello",nil,nil}
print("------next-------")
for k,v in next,a do
print(k.."="..v)
end
print("------ipairs-------")
for k,v in ipairs(a) do
print(k.."="..v)
end
print("------pairs-------")
for k,v in pairs(a) do
print(k.."="..v)
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
Table的插入和删除
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
a = {3,5,7;nil,x=3,y=5,z="hello",nil,nil}
table.insert(a,1,"aaa") --从下标的第一个插入,如果不写就是从下标的最后插入
for k,v in pairs(a) do
print(k.."="..v)
end
a = {3,5,7;nil,x=3,y=5,z="hello",nil,nil}
g = table.remove(a,1) --从下标的第一个元素插入,如果不写就都没删
print("g = "..g)
for k,v in pairs(a) do
print(k.."="..v)
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
加载和编译运行
--dofile("D:\\Quick-Cocos2dx-Community\\quick\\luastudy\\src\\app\\scenes\\aa.lua") --装载并执行
--file = loadfile("D:\\Quick-Cocos2dx-Community\\quick\\luastudy\\src\\app\\scenes\\aa.lua") --装载并编译为中间码,不执行
--local fun = assert(file) --返回更清楚的错误信息
--fun()
--f = loadstring("print(\"aabbcc\")")--将字符串当成一个文件进行加载
--f()
--[[
g = loadstring("function fun(a,b) return a*b end")
g()
num = fun(2,3)
print(num)
]]
require("app.scenes.aa") --会搜索目录加载文件,会判断是否文件已经加载避免重复加载同一文件,require是Lua中是加载库最好的函数
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
num = fun(3,5)
print(num)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
Table排序算法
sort.lua
require("app.scenes.sort")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
sortArr()
tableSort()
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
LuaLessonOne.lua
require("app.scenes.sort")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
sortArr()
tableSort()
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
字符串的操作
LuaLessonOne.lua
require("app.scenes.optString")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
strfind()
strReplace()
manyLine()
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
optString.lua
function strfind()
s = "aaabbbccc"
_start,_end = string.find(s,"ab")
print(_start.."---".._end)
t = "aaabbbcccaaaabbbbcccc"
_start,_end = string.find(t,"ab",5) --数字是从哪里开始找
print(_start.."---".._end)
r = "aaabbbcccaaaabbbbcccc"
ii = 0
repeat
_start,_end = string.find(t,"ab",ii)
if _start ~= nil then
print(_start.."---".._end)
ii = _end
else
break
end
until false
end
function strReplace()
i = "aaabbbcccaaaabbbbcccc"
i = string.gsub(i,"a","啊")
print(i)
end
--多行文本
function manyLine()
page = [[
<html>
<title></title>
<body>
hello,world
</body>
</heml>
]]
print(page)
end
取随机数
LuaLessonOne.lua
require("app.scenes.rand")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
getRand(0,10)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
rand.lua
function getRand(a,b)
mytime = os.time() --取系统时间
mytime = string.reverse(mytime) --倒叙
math.randomseed(1) --添加种子数
for i = 0,10 do
num = math.random(a,b)
print(num)
end
end
Math数学库
MathText.lua
function yunsuan()
local num = math.mod(14,5)--取模
print(num)
num = math.abs(-15)
print(num)
num = math.ceil(5.8) --向上取整
print(num)
num = math.floor(5.8) -- 向下取整
print(num)
num = math.max(2.71,100,-98,32)
print(num)
num = math.min(2.71,100,-98,32)
print(num)
num = math.rad(180) -- 角度取弧度
print(num)
num = math.deg(math.pi) --弧度取角度
print(num)
num = math.atan2(4,3) --y是4,x是3,与Xz轴的夹角
num1 = math.deg(num)
print(num1)
end
LuaLessonOne.lua
require("app.scenes.MathText")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
yunsuan()
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
文件操作
optfile.lua
function readFile()
local file,msg = io.open("D:\\Quick-Cocos2dx-Community\\quick\\luastudy\\src\\app\\scenes\\iter.txt","r")
if not file then print(msg) end
--s = file:read("*all") -- 显示全部
--print(s)
t = file:read("*line") -- 显示一行
print(t)
end
--r:只读文件
--w:如果文件存在就把文件里删除重新写入,如果不存在就创建文件再写入
--a:不删除直接写
function writeFile()
local file,msg = io.open("D:\\Quick-Cocos2dx-Community\\quick\\luastudy\\src\\app\\scenes\\iter.txt","a")
file:write("hello world\n")
file:flush() --清楚缓存
file:close() --关闭文件
end
LuaLessonOne.lua
require("app.scenes.optfile")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
writeFile()
readFile()
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
例外处理
execption.lua
function errorFun()
s = "15a"
if not tonumber(s) then
print("不是数字")
else
print("是数字")
end
end
--与If else相比,优化了lf else 判断
function execptionFun(str)
if str ~= "dd" then
error("这不是我要的字符") --通过error抛出例外
end
return "这是我要的字符"
end
LuaLessonOne.lua
require("app.scenes.execption")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
errorFun()
--用pcall捕获例外,后面是参数,如果有例外就交给第二个参数msg,返回值也交给msg,无例外第一个参数为true
b,msg = pcall(execptionFun,"rr")
print(b)
print(msg)
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
协同程序
协同程序和线程差不多,但又有比较明显的区别。
协同程序和线程都是在任意时刻只能执行一个,但概念不一样。
一个协同程序在运行的时候,其他协同程序是无法获得执行的机会的。只有正在运行的协同程序主动挂起时,其他协同程序才有机会执行。
而线程,即使不主动休眠,也很有可能因为时间碎片的时间到达而把机会让给其他线程。
LuaLessonOne.lua
require("app.scenes.coroutine")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
local co = coroutineFun()
for i = 1,11 do --第11次调用协程的时候才死掉
coroutine.resume(co,i,5) --调用协同调用线程,只有第一次传入的参数有效!
print(coroutine.status(co))
end
print(coroutine.status(co))
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
coroutine.lua
function coroutineFun()
local co = coroutine.create(function(a,b) --创建协程
for i = 1,10 do
print(a+b)
coroutine.yield() --挂起协程
end
end)
return co
end
闭包
闭包是函数中的函数,可以包含父函数的局部变量的代码块;可以让这些局部变量的值始终保持在内存中。
它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
LuaLessonOne.lua
require("app.scenes.bibao")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
local fun = func(3)
local fun1 = func(10) --如果不用闭包的话,这两个函数会互相干扰
for i = 1,10 do
fun()
fun1()
end
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
bibao.lua
function func(a)
local ii = a
function ff() --函数中的函数,因为返回的是里面的函数,所以ii会保存在内存中没被销毁
ii = ii+1
print(ii)
end
return ff
end
封装
User.lua
local User = class("User")
User.id = 1
User.name = "张三"
User.age = 20
function User:ctor() --Lua中所有的构造都叫ctor
print("User被构造了")
end
--Lua中不支持重载,后面的方法会把前面的方法覆盖掉
function User:fun()
print("这是User的成员方法")
end
function User:setId(id)
--User.id = id --这样赋值相当于把User中的id当成静态变量,实例化出来两个对象访问的是同一个id
self.id = id --这样赋值就是私有的对象访问之间互不影响
end
function User:getId()
--return User.id
return self.id
end
return User
LuaLessonOne.lua
local classUser = require("app.scenes.User")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
local user = classUser.new()
local user1 = classUser.new()
user:setId(225)
print("user.id = "..user:getId())
print("user1.id = "..user1:getId())
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
继承
LuaLessonOne.lua
local classTeacher = require("app.scenes.Teacher")
local LuaLessonOne = class("LuaLessonOne", function()
return display.newScene("LuaLessonOne")
end)
function LuaLessonOne:ctor()
local teacher = classTeacher.new()
teacher:fun()
cc.ui.UILabel.new({
UILabelType = 2, text = "LuaLessonOne", size = 64})
:align(display.CENTER, display.cx, display.cy)
:addTo(self)
end
return LuaLessonOne
User.lua
local User = class("User")
User.id = 1
User.name = "张三"
User.age = 20
function User:ctor() --Lua中所有的构造都叫ctor
print("User被构造了")
end
--Lua中不支持重载,后面的方法会把前面的方法覆盖掉
function User:fun()
print("这是User的成员方法")
end
function User:setId(id)
--User.id = id --这样赋值相当于把User中的id当成静态变量,实例化出来两个对象访问的是同一个id
self.id = id --这样赋值就是私有的,对象访问之间互不影响
end
function User:getId()
--return User.id
return self.id
end
return User
Teacher.lua
local User = require("app.scenes.User")
local Teacher = class("Teacher",User) --继承User,Lua中只能单继承
function Teacher:ctor()
self.super:ctor() --调用父类的构造函数
print("teacher被构造了") --在Lua中,调用子类的构造函数不会调用父类的构造
end
return Teacer