Lua语法(2)

元表
Lua 复制代码
--元表的概念
--[[
	任何表变量都可以作为另一个表变量的元表
	任何表变量都可以有自己的元表
	当我们子表中进行特定操作时
	会执行元表中的内容
]]

--如何设置元表
meta = {}
myTable = {}
--设置元表函数
--第一个参数 子表  第二个参数 元表
setmetatable(myTable,meta)


--元表的特定操作
--元表特定操作_tostring
meta2 = {
	--当子表要被当作字符串使用时,会调用元表tostring方法
	__tostring = function ()
		return "helloworld"
	end

}
myTable2 = {}
--设置元表函数
--第一个参数 子表  第二个参数 元表
setmetatable(myTable2,meta2)

print(myTable2)



--元表特定操作_call
meta3 = {
	--当子表要被当作字符串使用时,会调用元表tostring方法
	__tostring = function (a)
		return a.name
	end,
	--当子表被当作函数使用时,会调用__call的内容
	__call = function (a,b)
		print(a,b)
		print("call")
	end

}
myTable3 = {
	name = "nihao"
}
--设置元表函数
--第一个参数 子表  第二个参数 元表
setmetatable(myTable3,meta3)

myTable3(1) -- __call第一个参数默认是调用者本身,第二个参数才是传入的参数




--元表特定操作_运算符重载
meta4 = {
	--相当于运算符重载,子表使用+时调用
	    __add = function(a,b)
		return a.age + b.age
	end,
	--相当于运算符重载,子表使用-时调用
		__sub = function(a,b)
		return a.age - b.age
	end,
	--相当于运算符重载,子表使用*时调用
		__mul = function(a,b)
		return a.age * b.age
	end,
	--相当于运算符重载,子表使用/时调用
		__div = function(a,b)
		return a.age / b.age
	end,
	--相当于运算符重载,子表使用%时调用
		__mod = function(a,b)
		return a.age % b.age
	end,
	--相当于运算符重载,子表使用^时调用
		__pow = function(a,b)
		return a.age ^ b.age
	end,
	--如果要用条件运算符 来比较两个对象 这两个对象的元表必须一致才能准确调用方法
	--相当于运算符重载,子表使用==时调用
		__eq = function(a,b)
		return a.age == b.age
	end,
	--相当于运算符重载,子表使用<时调用
		__lt = function(a,b)
		return a.age < b.age
	end,
	--相当于运算符重载,子表使用<=时调用
		__le = function(a,b)
		return a.age <= b.age
	end,
	--相当于运算符重载,子表使用..时调用
		__concat = function(a,b)
		return "ab"
	end

}
myTable4 = {
	age =13
}
myTable5 = {
	age = 16
}
--设置元表函数
--第一个参数 子表  第二个参数 元表
setmetatable(myTable4,meta4)
setmetatable(myTable5,meta4)



print(myTable4 + myTable5)




--元表特定操作_index和_newIndex

meta6Father ={
	age = 1
}
meta6Father.__index = meta6Father

meta6 = {}
meta6.__index = meta6

myTable6 = {}

--设置元表函数
--第一个参数 子表  第二个参数 元表
setmetatable(myTable6,meta6)
setmetatable(meta6,meta6Father)
--__index当子表中找不到某个属性时 会到元表中 __index指定的表去找索引
print(myTable6.age)


--__newIndex 当赋值时,如果赋值一个不存在的索引,那么会把这个值赋值到newIndex所指的表中,不会修改自己
meta7 = {}
meta7.__newindex = {}

myTable7 = {}
--设置元表函数
--第一个参数 子表  第二个参数 元表
setmetatable(myTable7,meta7)

myTable7.age = 1
print(myTable7.age)
print(meta7.__newindex.age)



--获取元表
print(getmetatable(myTable7))
--rawget 当我们使用他时 会去找自己身上有没有这个变量
print(rawget(myTable7, "age"))
--rawset 该方法会忽略newindex的设置 只会该自己的变量
rawset(myTable7,"age",2)
面向对象
Lua 复制代码
--封装
--面向对象  类 都是基于表 table实现
Object = {}
Object.id = 1
function Object:Test()
	print("Test")
end
function Object:new()
	local obj = {}
    self.__index = self
	setmetatable(obj,self)
	return obj
end

local myObj = Object:new()
print(myObj.id)
myObj.Test()




--继承
function Object:subClass(className)
	_G[className] = {}

	local obj = _G[className]
	self.__index = self
	obj.base = self
	setmetatable(obj,self)

end
Object:subClass("Person")
print(Person.id)



--多态
Object:subClass("GameObject")
GameObject.posX = 0
GameObject.posY = 0
GameObject.posZ = 0
function GameObject:Move()
	self.posX = self.posX + 1
	self.posY = self.posY + 1
	self.posZ = self.posZ + 1
	print(self.posX,self.posY,self.posZ)
end

GameObject:subClass("Player")
function Player:Move()
   self.base.Move(self)
end

local p1 = Player:new()
p1:Move()
p1:Move()
local p2 = Player:new()
p2:Move()
自带库
Lua 复制代码
--时间

--系统时间
print(os.time())
--根据年月日转化时间
print(os.time({year = 2014,month = 8, day = 14}))
--os.date("*t")
local nowTime = os.date("*t")
for k,v in pairs(nowTime) do
	print(k,v)
end

--数学运算
--绝对值
print(math.ads(-11))
--弧度转角度
print(math.deg(math.pi))
--三角函数 传弧度
print(math.cos(math.pi))

--向下向上取整
print(math.floor(2.6))
print(math.ceil(5.2))

--最大值最小值
print(math.max(1,2))
print(math.min(4,5))

--小数分离 分成整数部分和小数部分
print(math.modf(1.2))

--幂运算
print(math.pow(2,5))

--随机数
--先设置随机数种子
math.randomseed(os.time())
print(math.random(100))

--开方
print(math.sqrt(4))

--路径
print(package.path)
package.path = package.path .. ";C:\\"
Lua垃圾回收
Lua 复制代码
--垃圾回收关键字  collectgarbage
--获取当前lua占用内存数 k字节  用返回值*1024可以得到具体内存占用字节数
collectgarbage("count")

--进行垃圾回收
collectgarbage("collect")

--Lua中有自动定时进行GC的方法
相关推荐
_Power_Y2 小时前
SSM面试题学习
java·开发语言·学习
SccTsAxR3 小时前
[初学C语言]关于scanf和printf函数
c语言·开发语言·经验分享·笔记·其他
害恶细君3 小时前
【超详细】使用conda配置python的开发环境
开发语言·python·jupyter·pycharm·conda·ipython
我星期八休息4 小时前
C++异常处理全面解析:从基础到应用
java·开发语言·c++·人工智能·python·架构
枫叶丹44 小时前
【Qt开发】输入类控件(五)-> QDateTimeEdit
开发语言·qt
xxxxxxllllllshi4 小时前
Java 集合框架全解析:从数据结构到源码实战
java·开发语言·数据结构·面试
爱编程的鱼5 小时前
Python 与 C++、C 语言的区别及选择指南
c语言·开发语言·c++
运维闲章印时光5 小时前
网络断网、环路、IP 冲突?VRRP+MSTP+DHCP 联动方案一次性解决
运维·服务器·开发语言·网络·php
lly2024065 小时前
TypeScript 循环
开发语言