Lua—一些Lua的基础语法知识 三分有点码
。
#三分有点码 博主整理了一些关于Lua的基础语法知识,注释了自己的理解,希望能够帮助到大家。
一、table表
1.table的定义以及取值
table的索引是从1开始,与其他语言不同,当索引越界会报nil错误,赋值方法和数组一致
nil也可占位,改索引的value为nil
1>.索引存储(数组)
local mytable={1,2,3}
print(mytable[1])
local mytable={[1]=1,[2]=2,[3]=3}
local mytable={1,2,3,[3]=4} 结果1,2,3 mytable[3]=4被覆盖为3
table底层赋值逻辑是先对指定索引进行赋值,再按顺序对未明确的进行赋值
2>.键值对存储(字典)
local mytable={1,2,5,a=6,b="aaa"}
print(mytable[1])
print(mytable[2])
print(mytable[3])
print(mytable.a)
print(mytable.b)
2.table动态定义 (变量无中生有)
客户端和服务端进行数据传输,Lua具有自解释特性,可接收服务器的key和value
local mytable={1,2,3}
mytable.id="2123"
3.table嵌套(结构)
local mytable={1,2,3}
mytable.userdata={atk=22,def=236}
print(mytable.userdata.atk)
4.table定义方法
function mytable:test(p)
print(p)
print(mytable[1])
end
5.table判断是否为空
local mytable
if mytable==nil then
print("为空")
end
在tabel申明但没赋值或={}时可进行判断,担当tabel={}进行定义后该判断失效
local mytable={}
if mytable=={} then
print("为空")
end
该方法是错误的,原因是=={}实际上是新定义了一个table,在比较两个不同table的地址,他们永远都不会相等,所以该 判断根本无法进入。
*****************************************
if next(mytable)==nil then
print("为空")
end
*****************************************
该方法通过next()判断table是否为空,原理是判断下一个元素的值是否为nil,可传参数(tablename,key)
6.获取table长度
print(#mytable)
*****************************************
local mytable={1,2,5,a=6,b="aaa"}
print(#mytable) --3
local mytable={1,nil,5,a=6,b="aaa"}
print(#mytable) --1
*****************************************
当table内所有元素均为数组类型的时候输出才是正确的长度,如遇nil,嵌套,字典类或方法时会自动停止计数
靠谱的还是通过遍历
print(tabel.getn(mytabel))
二、pairs遍历(用来遍历table)
可遍历全部的元素
for i,v in pairs(table) do
print(i) --键
print(v) --值
end
遍历顺序为:未定义具体索引《嵌套定义《明确索引定义《方法定义《动态索引定义
三、ipairs遍历(用来遍历table)
遇到nil就会停止遍历,并且只会遍历数组类,遇到其他类型也会停止遍历
for i,v in ipairs(table) do
print(i) --键
print(v) --值
end
四、元表
1.定义元表
local mytabel={1,2,3}
local mymetatable={}
mytable=setmetatable(mytable,mymetatable) --设置元表
mytable=({1,2,3},{}) --直接赋值设置元表
getmetatable(mytable) --获取元表中的mymetatable
2.元方法
相当于C#中的继承,会先从父类寻找,父类有用父类,父类没有从子类寻找,子类没有就找父类的,都没有则结束
1>.__index
**********************************************************************************
__index有两种方式存在,一个是tabel,另一个是function
**********************************************************************************
local mytable={1,2,3}
local mymetatable={
__index={b=3,c="Sdfsd"}
}
mytable=setmetatable(mytable,mymetatable)
print(mytable.b)
**********************************************************************************
local mytable={1,2,3}
local mymetatable={
__index=function(table,key) --第一个参数是类型,第二个是索引
if key=="b" then
return "hello"
else
return nil
end
end
}
mytable=setmetatable(mytable,mymetatable)
print(mytable.b)
print(mytable.a)
2.__newindex
**********************************************************************************
当给一个不存在元素赋值时,当有该方法存在则调用,否则会进行赋值。**可用于错误检测
**********************************************************************************
local mytable={1,2,3}
local mymetatable={
__index=function(table,key) --第一个参数是类型,第二个是索引
if key=="b" then
return "hello"
else
return nil
end
end
,
__newindex=function(table,key)
print("__newindex被调用"..key)
end
}
mytable=setmetatable(mytable,mymetatable)
print(mytable.b)
mytable.a=345 --因为没有该元素,所以会报出”__newindex被调用a“并返回该元素索引
3.__call
**********************************************************************************
当调用一个值的时候会被调用
**********************************************************************************
local mytable={1,2,3}
local mymetatable={
__index=function(table,key) --第一个参数是类型,第二个是索引
if key=="b" then
return "hello"
else
return nil
end
end
,
__newindex=function(table,key)
print("__newindex被调用"..key)
end
,
__call=function(mytable,newtable)
sum=0
for i=1,#mytable do
sum=sum+mytable[i]
end
for i=1,#newtable do
sum=sum+newtable[i]
end
return sum
end
}
mytable=setmetatable(mytable,mymetatable)
newtable={10,20,30}
print(mytable.b)
mytable.a=345
print(mytable(newtable))
4.__tostring
**********************************************************************************
用来对表做操作(例打印表,长度,赋值等)
**********************************************************************************
local mytable={1,2,3}
local mymetatable={
__index=function(table,key) --第一个参数是类型,第二个是索引
if key=="b" then
return "hello"
else
return nil
end
end
,
__newindex=function(table,key)
print("__newindex被调用"..key)
end
,
__call=function(mytable,newtable)
sum=0
for i=1,#mytable do
sum=sum+mytable[i]
end
for i=1,#newtable do
sum=sum+newtable[i]
end
return sum
end
,
_tostring =function(mytable)
print(#mytable)
return #mytable
end
}
mytable=setmetatable(mytable,mymetatable)
newtable={10,20,30}
print(mytable.b)
mytable.a=345
print(mytable(newtable))
print(mytable)
5.__add
**********************************************************************************
用来将两个表相加,直接通过+进行相加是错误的
**********************************************************************************
local mytable={1,2,3}
local mymetatable={
__index=function(table,key) --第一个参数是类型,第二个是索引
if key=="b" then
return "hello"
else
return nil
end
end
,
__newindex=function(table,key)
print("__newindex被调用"..key)
end
,
__call=function(mytable,newtable)
sum=0
for i=1,#mytable do
sum=sum+mytable[i]
end
for i=1,#newtable do
sum=sum+newtable[i]
end
return sum
end
,
_tostring =function(mytable)
print(#mytable)
return #mytable
end
}
mytable=setmetatable(mytable,mymetatable)
newtable={10,20,30}
print(mytable.b)
mytable.a=345
print(mytable(newtable))
print(mytable)
五、方法
1.方法的定义和调用
mytable=setmetatable({1,3},{})
function mytable: test(p)
print(p)
print(mytable[1])
end
mytable:test(23) --**":"调用方法直接可传参
mytable.test(mytable,23) --**"."调用方法要显式传表和参数