
字符串操作
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