目录
3、获取子文件中的局部变量(被加载子文件加return返回给加载文件)
一、Lua的环境搭建
1、安装vscode
2、安装lua环境插件
3、安装lua解释器插件
二、参考文档
lua官方网址:http://www.lua.org/
5.3参考文档:http://www.lua.org/manual/5.3/
5.3参考文档,中文版(来自菜鸟教程):https://www.runoob.com/manual/lua53doc/contents.html
沈军老师教程参考文档:https://shenjun-coder.github.io/LuaBook/
三、基础语法
Ⅰ、变量
a=10 --全局变量
local a=10 --局部变量
Ⅱ、注释
-- 单行注释
--[[
多行注释
]]
Ⅲ、基本数据类型
数据类型 | 描述 |
---|---|
nil | 表示一个无效值 |
boolean | 布尔类型,包含两个值:true和false |
number | 数值类型,表示双精度的类型的实浮点数 |
string | 字符类型,表示字符串类型,字符串由一对单引号或者双引号来表示 |
function | 函数类型 |
userdata | 自定义数据类型 |
table | 表类型,其实是一个“关联数组”,相当于集合,lua里面一切皆为表,利用表实现面向对象 |
thread | 了解 |
类型检测函数:
print(type('a')) --string
print(type("a")) --string
print(type(nil)) --nil
print(type("nil")) --string
print(type(table)) --table
print(type(0.1)) --number
print(type(true)) --boolean
local a=nil;
local b="nil";
print(a==b) --false
print(a==nil) --true
print(type(a)==nil) --false
print(type(a)=='nil') --true
Ⅳ、基本数据类型操作
一、字符串(string)操作
1、定义字符串
local str1="abc" local str2 ='def' local str3 = [[a]] -- [[文本]] 完整的输出文本,会将a作为一个整体输出
2、获取字符串的长度
local str1 = 'abc' local str2 = "def" local str3 =[[a]] local str3 = [[a,1+1]] print(str3) --a,1+1 --获取字符串的长度 print(#str2) --3 print(#str3) --5
3、字符串的拼接
--字符串的拼接 print(str2..str3) --defa,1+1
4、字符串的大小写化
--字符串的大写化 print(string.upper(str1)) --ABC --字符串的小写化 print(string.lower('ABC')) --abc
5、字符串的查找
--字符串的查找 --参数1:被查找的字符串 --参数2:查找的内容 --返回值:起始找到的位置下标和结束找到的位置下标 print(string.find("abcdefg",'cde')) --3 5 -- lua支持多返回值 -- lua(字符串)中的下标都是从1开始的
6、字符串的反转
--字符串的反转 print(string.reverse(str1)) --cba
7、字符串的截取
--字符串的截取 --方式一:(提供起始位置的下标,截取到结尾) local data ='abcdefghijk' print(string.sub(data,3)) --cdefghijk --方式二:(提供起始位置的下标,提供结束位置的下标):包含左边不包含右边,左闭右开 print(string.sub(data,3,#data-2)) --截取到倒数第二个字符 cdefghi
8、字符串格式化
local name= "zhangsan" local age=18 print(string.format("he name is %s,age is %d ",name,age)) --he name is zhangsan,age is 18
9、字符串的重复
--字符串的重复:function string.rep(s: string, n: integer, sep?: string) --返回 n 个字符串 s 以字符串 sep 为分割符连在一起的字符串。 默认的 sep 值为空字符串(即没有分割符)。 如果 n 不是正数则返回空串。 --参数1:被重复的字符串 --参数2:重复的次数 print(string.rep("abc",2)) --abcabc
10、ASCI码转字符
--ASCI码转字符(即将二进制流转化为字符) print(string.char(65)) --A
11、字符转ASCI码
--字符串转ASCI码(即将字符转换为二进制流) print(string.byte("A")) --65
12、字符串的替换
--字符串的替换 --参数1:原始串 --参数2:需要替换后的内容 --参数3:替换后的内容 --返回值:替换结果,替换的次数 print(string.gsub("abcde","bc","**")) --a**de 1
二、表(table)操作
1、表的定义以及特性
--表相当于c#中的数组 --表的定义 local arr ={} --表的特性 --起始索引是从1开始的 --类型可以混合 --索引值可以为负数 --即使索引是从1开始的,也可以赋值0索引 --初始化时,对于没有索引的值,索引是从1向上累加的 --初始化提供索引的赋值方法,[索引值] = 数值 local data ={"abc",123,[-1] = 100,[0] = 99 , [4]=444} print(data[-1]) --100 print(data[0]) --99 print(data[1]) --abc print(data[2]) --123 print(data[3]) --nil print(data[4]) --444
2、获取表的长度
--获取表的长度 --这种方式,获得的是从索引1开始的,索引连续的数据个数,中间断开,计数结束 --这种方式不稳定,后续都使用迭代器获取 print(#arr) --0 print(#data) --2
3、遍历表
--迭代器(遍历表) --one="aa"是不加中括号的的字符串索引,等同于["one"]="aa" --"zhangsan:18","lisi:1"自动加索引1,2 --[5]="www"是指定数字索引 local data = {zhangsan=18,"zhangsan:18","lisi:1",18,"aaa",one="aa",["two"]="bb",[5]="www"} for key, value in pairs(data) do print("k:"..key.." v:"..value) end
4、获取表的值
4、向表中添加元素
5、删除表中元素
6、对表排序
三、函数(function)操作
1、函数的声明以及调用
--函数的定义 function fun1() print("这是fun1") end --将函数定义为一个变量,函数也是一种数据类型 local fun2 = function () print("这是fun2") end fun2()
2、可变参数函数
--可变参数函数 local fun3 = function(...) --将无固定参数,转换为table local args = {...} --arg的作用域是fun3函数体, {...} 表示一个由所有变长参数构成的数组 local sum = 0 for i, v in ipairs { args } do s = sum + v end return sum end
3、多返回值函数
--lua中的函数可以有多个返回值 --题目:编程实现输出给定表中的最大数和最小数字 local data1 = {1,1.5,2,5,10,6,9} local fun1 =function (data) for i = 1, #data, 1 do for j = 1, #data-i, 1 do if (data[j]>data[j+1]) then local flag flag= data[j] data[j]=data[j+1] data[j+1]=flag end end end return data[1],data[#data] end local min,max=fun1(data1); print(min.." "..max) --1 10
4、表中的函数
--表中的函数 --需求,将给定表中第一个元素的值更改成zhangsan local data ={"abc",123,[-1] = 100,[0] = 99 , [4]=444,["two"]="zhangsan"} data.fun4 = function () print("我是fun4") data[1]=data.two print(data[1]) --zhangsan 此种方法当data的名字改变时,此函数会出错,在c#中可以使用this,此处可以使用self end data.fun4() print("--------------------") --第一种方法,使用self显式定义 data.fun5 = function (self) print("我是fun5") self[1]= self.two print(self[1]) --zhangsan 函数内部可以通过self变量获取当前table的其他值或者函数 end data:fun5() --此时调用需要用冒号 print("--------------------") --第二种方法,使用self隐式定义 function data:fun6() --隐式的定义self print("我是fun6") self[1] = self.two print(self[1]) end data:fun6() --调用方法是冒号,lua中使用表来实现面向对象,调用对象的方法一般都使用 : 表名:函数名() --lua中的调用对象中的属性 : 表面.属性名
四、流程控制
Ⅰ、条件语句流程
--if..else语句
local a=2
if (a~=2) then
print("a~=2")
else print("a=2")
end
-- a=2
--Lua中不等于:~=
--if..elseif..else语句
local a =3
if (a==2) then
print("a~=2")
elseif (a>2) then
print("a>2")
elseif (a<2) then
print("a<2")
end
--Lua中沒有switch語句
Ⅱ、循环流程
1、while循环语句
--while循环语句 local num = 1 while (num<3) do print(num) num=num+1 end --do..while循环语句 local num=1 repeat print(num) num=num+1 until(num>5) --Lua中没有continue
2、for循环
local data = {"zhangsan","18","aaa"} --参数1:变量i的初始值,表的零号下标为1 --参数2:增长到多少 --[参数3]:增长步长,默认值为1 for i=1,#data do print(data[i]) end --倒序遍历 for i=#data,1,-1 do print(data[i]) end
五、特殊语法
Ⅰ、原表
1、设置原表
2、获取原表
--原表:可以实现对表的扩展 local t1 = { zhangsan = 18, "aaa", [0] = "bbb" } print(t1) --table: 000002593CE73C10 --需求,期望打印t1时,以人类易于阅读的方式打印 setmetatable( t1, --需要进行元素扩展的表 { __tostring = function(t) --t1的元方法 local t1FormatStr = "{" for key, value in pairs(t) do t1FormatStr = t1FormatStr .. key .. "=" .. value .. "," end t1FormatStr = t1FormatStr .. "}" return t1FormatStr end } ) print("------------") print(t1) -- --{1=aaa,zhangsan=18,0=bbb,} print("------------") local t2={} setmetatable(t2,t1) --setmetatable(table,metatable):把 metatable 设为 table 的元表 print(getmetatable(t2)) --getmetatable(table): 返回对象的元表(metatable)
Ⅱ、子文件加载
1、加载文件的相对路径
--子文件加载 --查看预加载目录 print(package.path) --D:\VSCode\VSCodeWorkspace\LuaStudy/?.lua --加载文件的相对路径,表示相对于预加载package包,所在的目录 require("/day02/forTest") -- "./"表示预加载package包,所在的目录 -- "../"表示预加载package包,所在的上一级目录 require("./day02/forTest")
2、查看加载文件的记录
--子文件加载 --查看预加载目录 print(package.path) --D:\VSCode\VSCodeWorkspace\LuaStudy/?.lua --加载文件并会将加载的文件中的代码执行一下 --文件名中如果包含特殊符号,比如".","$"等,会导致加载错误 --文件的扩展名不需要添加,在lua中 . 是文件分隔符 require("./day02/forTest") --查看表中已经加载过的文件记录 print(package.loaded["./day02/forTest"]) --true --重复多次加载一个文件 --package.loaded["./day02/forTest"] = nil --或者 package.loaded["./day02/forTest"] = false print(package.loaded["./day02/forTest"]) --false
3、获取子文件中的局部变量(被加载子文件加return返回给加载文件)