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)    --**"."调用方法要显式传表和参数