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的方法
相关推荐
传奇开心果编程1 小时前
【Rust入门知识点学与练】第24课:Trait 基础
开发语言·学习·rust
言乐67 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
金金计较.7 小时前
Go语言-3
java·开发语言·golang
张小凡vip8 小时前
python--爬虫--经验积累的遇到的坑
开发语言·爬虫·python
Wang's Blog8 小时前
Java框架快速入门: Spring Security+OAuth2之云服务集成与多因子认证设计
java·开发语言·spring
门思科技9 小时前
LoRaWAN 网络容量估算:一个 SX1302 网关到底能带多少设备
开发语言·网络·php
大草原的小灰灰9 小时前
Python基础语法
开发语言·python
泡泡鱼(敲代码中)11 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
潜创微科技12 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu12 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm