Lua--环境搭建以及基础语法

目录

一、Lua的环境搭建

二、参考文档

三、基础语法

Ⅰ、变量

Ⅱ、注释

Ⅲ、基本数据类型

Ⅳ、基本数据类型操作

一、字符串(string)操作

1、定义字符串

2、获取字符串的长度

3、字符串的拼接

4、字符串的大小写化

5、字符串的查找

6、字符串的反转

7、字符串的截取

8、字符串格式化

9、字符串的重复

10、ASCI码转字符

11、字符转ASCI码

12、字符串的替换

二、表(table)操作

1、表的定义以及特性

2、获取表的长度

3、遍历表

三、函数(function)操作

1、函数的声明以及调用

2、可变参数函数

3、多返回值函数

4、表中的函数

四、流程控制

Ⅰ、条件语句流程

Ⅱ、循环流程

1、while循环语句

2、for循环

五、特殊语法

Ⅰ、原表

1、设置原表

2、获取原表

Ⅱ、子文件加载

1、加载文件的相对路径

2、查看加载文件的记录

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返回给加载文件)

 

猜你喜欢

转载自blog.csdn.net/qq_53663718/article/details/128227008
今日推荐