Lua


字符串操作
https://www.runoob.com/lua/lua-strings.html
元方法
https://www.runoob.com/lua/lua-metatables.html

--data type
a1=20.5 --number,64位浮點(diǎn)
a2=true --boolean
a3=nil --nil
a4="123" --string
--a5,a6,a7,a8 --table --function

--type函數(shù)
print(type(a1)=="number") --true

--string operation
print(a4+2) --125
print(a4..a4) --123123
print(#a4) --3

--作用域:默認(rèn)全局變量,作用域到塊結(jié)束
b=1
function  f()
    local b=2
    print(b)
end
f() --2
print(b) --1

--賦值,多值賦值
a,b=1,2
print(a,b) --1 2
b,a=a,b
print(a,b) --2 1
a,b=1,2,3
print(a,b) --1 2
a,b=1
print(a,b) --1 nil
function f1()
    return 1,2
end
a,b=f1()
print(a,b) --1 2

--索引
a={}
a["index"]="value"
print(a["index"]) --value
print(a.index) --value

--循環(huán)
--for
function f(x)
    return x
end
for a=1,f(5),2 do
    print(a) --1 3 5
end

a={5,6,7}
for i,v in ipairs(a) do --ipairs用來遍歷訪問table,i->index 從1開始,v->value
    print(i,v) --1,5 2,6 3,7
end
--while
a=0
while(a<3) do
    print(a) --0 1 2
    a=a+1
end
--repeat
a=1
repeat
    a=a+1
    print(a) --2 3 4
until(a>3)
--break
a=1
while(a<5) do
    if(a>3) then
        break
    end
    a=a+1
    print(a) --2 3 4
end

--條件,nil,false為否,非nil,false為是,0也是是
a=0
if(a) then
    print("yes") --yes
end

a=0
if(a==1)then
    print(1)
else
    print(0) --0
end

a=2
if(a==1)then
    print(1)
elseif (a==2) then
    print(2) --2
else
    print(3)
end

--函數(shù),默認(rèn)全局
local function MyPrint(a,b,c)
    print(a,b,c)
end
MyPrint(1,2,3) --1 2 3

--函數(shù)作為參數(shù)
function PrintABC(a,b,c,printfunc)
    printfunc(a,b,c)
end
PrintABC(2,3,4,MyPrint) -- 2 3 4

--多值返回
function ReturnMore(a,b,c)
    return a,b,c
end
a,b=ReturnMore(1,2,3)
print(a,b) --1 2

--變長參數(shù)與select
--select(n,...)返回從n開始到結(jié)束的列表,不是table
--select("#",...)返回參數(shù)列表長度
function f(p,...)
    local a={select(2,...)}
    for i,v in ipairs(a)do
        print(i,v) --1 4
    end
    print(p) --2
    print(select("#",...)) --2
    return p,...
end
a,b=f(2,3,4)
print(a,b) --2 3 可以看到這里返回的是列表

--運(yùn)算符
--算術(shù)運(yùn)算符 +,-,*,/,%,^,-
print(1+2) --3
print(2-1) --1
print(2*3) --6
print(3/2) --1.5
print(3%2) --1
print(3^2) --9
print(-3) -- -3

--關(guān)系運(yùn)算符 ==,~=,>=,<=,<,>
print(1==2) --false
print(1~=2) --true
print(2>=1) --true
print(2<=1) --false
print(1>2) --false
print(1<2) --true

--邏輯運(yùn)算符 and,or,not
print(2>1 and 1<3) --true
function f()
    print("hello")
    return false
end
print(2>1 or f()) --true,f()沒有計(jì)算
print(not(2>1))  --false

--其他運(yùn)算符 .. #
a="hello ".." world" --連接
print(a) --hello  world
b=#a --長度
print(b) --12
array={[1]=2,[2]=3,[26]=4}
print(#array) --2 ,#在索引中斷處停止計(jì)數(shù)了

--字符串,略
--數(shù)組
array={1,2,3}
for i=1,3 do
    print(array[i]) --1 2 3
end
--索引可以為負(fù)
array={}
for i=-2,2 do
    array[i]=i
end
for i=-2,0 do
    print(array[i])-- -2,1,0
end
array={}
for i=1,3 do
    array[i]={}
    for j=1,3 do
        array[i][j]=i*j
    end
end
for i=1,3 do
    for j=1,3 do
        print(array[i][j]) --1,2,3 2,4,6 3,6,9
    end
end

--迭代器
--無狀態(tài)
--for in 函數(shù),狀態(tài)常量,變量
function it(array,index)
    index=index+1
    local v=array[index]
    if(v~=nil) then
        return index,v
    end

end
function myIpairs(array)
    return it,array,0
end
array={2,3,4}
for i,v in myIpairs(array) do
    print(i,v) --1,2 2,3 3,4
end

--多狀態(tài)迭代器
array={2,3,4}
function it(array)
    local lenth=#array
    local index=0;
    return function()
        index=index+1
        if(index<=lenth) then
            return array[index]
        end
    end
end
for elem in it(array) do
    print(elem) --2 3 4
end
--table
array={1,a,2}
for i,v in ipairs(array) do
    print(i,v)
end

--值傳遞
local a=1
local b=a
a=nil
print(b)
--指針傳遞
local a={}
a[1]="asd"
b=a
print(b[1]) --asd
a[1]="bsd"
print(b[1]) --bsd

--table常用操作 concat,insert,remove,sort(升序)
t={"hello","wor","ld"}
print(table.concat(t,",",1,3)) --hello,wor,ld
table.insert(t,"!!!")
print(table.concat(t)) --helloworld!!!
table.remove(t,1)
print(table.concat(t)) --world!!!
t={2,3,1}
table.sort(t)
print(table.concat(t)) --123


--模塊化
--"moduleTest.lua"
local moduleTest={}
moduleTest.a=1
return moduleTest

--“start.lua”
local mm=require("moduleTest")
print(mm.a) --1


--元表,元表有點(diǎn)像c++里的操作符重載,在特定條件下觸發(fā)
--getmetatable,setmetatable
--__index,__newindex
t1={key1=1,key2=2}
t2={key3=3}
setmetatable(t1,{__index=t2}) --當(dāng)表里沒有該鍵時(shí)查看元表中的__index,index指向一個(gè)表,使得t1可以訪問t2中的鍵
print(t2.key3) --3
setmetatable(t1,{__index=function (t,key)
    return 4
end})
print(t1.key4) --4 --當(dāng)表里沒有該鍵時(shí)查看元表中的__index,index指向一個(gè)函數(shù),獲得函數(shù)返回值

t1={key1=1,key2=2}
t2={}
setmetatable(t1,{__newindex=t2})
t1.key3=3
print(t1.key3,t2.key3) --nil 3 --當(dāng)表里沒有鍵時(shí),為元表指向的表添加

-- __add 相加時(shí)觸發(fā)函數(shù)
t1={1,2,3}
t2={4,5}
setmetatable(t1,{__add=function(first,second)
    for i=1,#second do
        table.insert(first,second[i])
    end
    return first
end})
t1=t1+t2
for i,v in ipairs(t1) do
    print(v) --1 2 3 4 5
end

--__tostring
t1={1,2,3}
setmetatable(t1,{__tostring=function(table)
    s=""
    for i,v in ipairs(table) do
        s=s..v
    end
    return s
end})
print(t1) --123
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言# 前兩章我們總結(jié)了lua_is*系列和lua_to*系列,掌握了lua棧內(nèi)值的判斷和轉(zhuǎn)換方法,現(xiàn)在我們來看看...
    AlbertS閱讀 6,492評論 0 2
  • 前言# 前面幾篇都是講c/c++代碼對lua文件中數(shù)據(jù)的讀取和設(shè)置,這一篇我們來看看對數(shù)據(jù)類型的判斷,這是非常有用...
    AlbertS閱讀 7,272評論 1 3
  • 前言# 看了前幾篇自己總結(jié)的文章,我發(fā)現(xiàn)了一個(gè)問題,那就是從標(biāo)題上不能直接的看出文章所講的內(nèi)容,所以從這一章開始我...
    AlbertS閱讀 9,705評論 0 6
  • 前言# 通過上一章所說的lua_is*系列,我們已經(jīng)可以判定數(shù)值的類型,但是這不是我們的最終目的,我們的最終目的是...
    AlbertS閱讀 8,855評論 0 5
  • 開篇 今天來簡單了解一下 Lua 的函數(shù)調(diào)用:lua_call。 解析 函數(shù)調(diào)用協(xié)議 void lua_call ...
    碼上說閱讀 5,595評論 0 1

友情鏈接更多精彩內(nèi)容