Lua基础学习记录(持续更新)

变量定义

--变量定义
name="小明"
age=16
heightXM=1.17

local weight=48

function tes()
    weight2=52
    print(weight2)
end

tes()

枚举

--枚举
--创建枚举定义
function CreatEnumTable(tbl,index)
    local enumtbl = {
    
    } --创建空表
    local enumindex=index or 0
    for i,v in ipairs(tbl) do
        enumtbl[v]=enumindex+i
    end
    return enumtbl
end

Enumtable={
    
    
    "Red",
    "Green",
    "Blue",
}

Enumtable=CreatEnumTable(Enumtable)
print(Enumtable.Green)

结构体和类

--结构体和类
--Lua类更像是一个类中包含很多静态变量和函数
--成员变量声明:表的内部、表的外部
student={
    
    
    age=18,
    sex="girl",
    up=function()
        local age2=12
        print("小明")
    end
}
print(student.age)
--在声明表后,可以在表外部去声明表的变量和方法
student.age=22
print(student.age)
student.name = "小"
print(student.name)
--表外部加函数的两种写法
--方法1
student.play=function()
    print("play game")
end
student.play()
--方法2
function student.play2()
    print("play other game")
end
student.play2()
--想要在表内部函数中,调用表本身的属性或者方法一定要指定是谁的,所以要使用表名.属性或者表名.方法
Teacher={
    
    
    page=30,
    Teach=function()
        print('大家把书翻到'..Teacher.page..'页') --'..'用于连接类似C#里面的'+'
    end,
    Learn=function(t)
        print(t.page)
        print('好好学习')
    end
}
Teacher.Teach()
--lua中点和冒号的区别
Teacher.Learn(Teacher) --需要传参
Teacher:Learn() --默认把调用作为第一个参数传入
Teacher:Teach() --无参调用

可空判断

--可空判断
--在很多情况下我们在访问一些table型变量时,需要先判断该变量是否为null
local person={
    
    name="Nemo",sex="Female"}
person=nil
if person~=nil and person.name~=nil then
    print(person.name)
else
    print("没有这个值")
end

--对于简单类型的变量 我们可以用 if(var=nil)then 这样的语句判断
--但是对于table类型的lua对象 不能简单判定是都为空
--table类型值可能是{} 并不等于nil
local next=next
local a={
    
    }
local b={
    
    name="Bob",sex="Male"}
local c={
    
    "Trump","Evake"}
local d=nil
if a==nil then
    print('a=nil')
end
if b==nil then
    print('b=nil')
end
if c==nil then
    print('c=nil')
end
if d==nil then
    print('d=nil')
end

function isTableEmpty(t)
    return t==nil or next(t)==nil
end
print(next(b))
print(isTableEmpty(a))

字符串

--String类型字符串
--字符串复制
--string.rep(str,n)
repStr=string.rep("hello everyone\n",2)
print(repStr)

--字符比较 string.match("原字符串","模式字符串")
--判断字符串包含另一个字符
str1 = "You are very handsome"
str2 = "I am very rich"
str3 = "I am very rich"
str4 = "I am very handsome"
compareStr=string.match(str3,str4)
print(compareStr)

function Equals(str1,str2)
    comStr=string.match(str1,str2)
    if comStr==nil then
        return false
    else
        return true
    end
end
result=Equals(str1,str2)
print(result)

--字符串查找 string.find("原字符串","模式字符串")
--string.find(str,substr,[int,[end]]) 返回起始和结束索引,不存在返回nil
--下标从1开始
BaseStr="Hello everyone"
NewStr="every"
Str=string.find(BaseStr,NewStr)
print("起始位置:"..Str)

--字符串截取 string.sub(s,i,[j]) s要截取的字符串 i截取的开始位置 j截取的结束位置,默认-1,最后一个字符
BaseStr2="Hello my name is BUG"
local first_sub=string.sub(BaseStr2,7,13);
print(first_sub)

--截取最后10个
local back_sub=string.sub(BaseStr2,-11,-5)
print(back_sub)

--索引越界
local first_sub2=string.sub(BaseStr2,6,100)
print("下标越界截取测试:"..first_sub2)

local back_sub2=string.sub(BaseStr2,-100)
print("下标越界截取测试:"..back_sub2)

--字符串分割
--方式一:闭包函数的方式
function Split(input,delimiter)
    input=tostring(input)
    delimiter=tostring(delimiter)
    if delimiter=="" then
        return false
    end
    local pos,arr=0,{
    
    }
    for st,sp in function()
        return string.find(input,delimiter,pos,true) end do --st sp等到该返回值
        table.insert(arr,string.sub(input,pos,st-1))
        pos=sp+1
    end
    table.insert(arr,string.sub(input,pos))
    return arr
end
local testStr="10+20+100"
print(unpack(Split(testStr,'+')))
--方式二:while循环的方式
function splitWhile(input,delimiter)
    if type(delimiter)~="string"or#delimiter<=0 then
        return
    end
    local start=1
    local arr={
    
    }
    while true do
        local pos=string.find(input,delimiter,start,true)
        if not pos then
            break
        end
        table.insert(arr,string.sub(input,start,pos-1))
        start=pos+string.len(delimiter)
    end
    table.insert(arr,string.sub(input,start))
    return arr
end
print(unpack(splitWhile(testStr,'+')))

--字符串合并 ..
print('www.bilibili'..'.com')

--字符串长度 string.len(str)
--使用# 代表返回字符串长度
str5="i am your dj"
print(string.len(str5))
print(#str5)

--字符串替换 string.gsub(str,sourcestr,destr,[n]) str源字符串 source匹配字符串 destr替换字符串 n源字符串前n个destr,可替换个数
str="i am dj er dsds vcvc asad"
str2=string.gsub(str,"a","o",2)
print(str2)
--匹配整个字符串的替换方式去除字符串首尾的空格
--以'^'开头表示只匹配字符串的开始部分
--以'$'结尾表示只匹配字符串的结尾部分
function trim(s)
    return(string.gsub(s,"^%s*(.-)%s*$","%1"))
end
print(trim(" sadadadas ").."ss")

--字符串的插入与填充
--从插入的索引位置把字符串拆分成左右两边,然后在中间加一个要插入的字符串,然后组合拼接起来
--方法又考虑到项目中字符串前缀可能会有标识符(参数flag),所以做了一个加上前缀长度的功能
function string_insert(str,index,insertStr,flag)
    if flag and string.find(str,flag)~=nil then
        index=index+#flag
    end
    local pre=string.sub(str,1,index-1)
    local tail=string.sub(str,index,-1)
    local createStr=string.format("%s%s%s",pre,insertStr,tail)
    return createStr
end
str="i am dj er dsds vcvc asad"
print(string_insert(str,2,"not"))

--字符串的删除
function LuaRemove(str,remove)
    local lcSubStrTab={
    
    }
    while true do
        local lcPos=string.find(str,remove)
        if not lcPos then
            lcSubStrTab[#lcSubStrTab+1]=str
            break
        end
        local lcSubStr=string.sub(str,1,lcPos-1)
        lcSubStrTab[#lcSubStrTab+1]=lcSubStr
        str=string.sub(str,lcPos+1,#str)
    end
    local lcMergeStr=""
    local lci=1
    while true do
        if lcSubStrTab[lci] then
            lcMergeStr=lcMergeStr..lcSubStrTab[lci]
            lci=lci+1
        else
            break
        end
    end
    return lcMergeStr
end
str="@ds @ dsd dsds @ @@ sdada"
local newStr=LuaRemove(str,"@")
print(newStr)

--字符串大小写转换
str="I am YOUR Dj"
print("小写转换:"..string.lower(str))
print("大写转换:"..string.upper(str))

--字符串转ASCII码
str="I am your Dj"
print("字符串转ASCII码:"..string.byte(str,2))
--ASCII码转字符串
print("ASCII码转字符串:"..string.char(65))

运算符

--算数运算符
a=21
b=10
d=3
c=a+b
print("测试:a+b="..c)
c=a-b
print("测试:a-b="..c)
c=a*b
print("测试:a*b="..c)
c=a/b
print("测试:a/b="..c)
c=a%b
print("测试:a%b="..c)
c=b^d
print("测试:b^d="..c)

--关系运算符
if a==b then
    print("a等于b")
end
if a~=b then
    print("a不等于b")
end
if a>b then
    print("a大于b")
end
if a<b then
    print("a小于b")
end

--逻辑运算符
a=true
b=false
if a and b then
    print("a和b都为真")
end
if a or b then
    print("a和b至少有一个为真")
end
if not(a and b) then
    print("a和b至少有一个为假")
end

猜你喜欢

转载自blog.csdn.net/Bug1997/article/details/124592998