C++之Lua基础学习笔记

局部变量和全局变量
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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值