当前位置: 首页 > news >正文

Lua函数与表+Lua子文件加载与元表

Lua函数相关示例代码 

--脚本型语言,不能先调用,再定义,因为代码是从上往下执行的
--第一种声明函数
function func1()
    print("这是func1")
end

--先定义,再调用,没有问题
func1()
------------------------------------------------------
--将函数定义为一个变量,函数是一种数据类型
local func2=function()
    print("这是func2")
end
func2()

--------------------------------------------------
local func3=function(a,b)
	print(a+b)
end

--函数的调用,参数可以多于形参,但是不能少于形参
func3(5,7)
func3(5,7,9)
----------------------------------------------------
local func4=function(...)
	--将无固定参数,转换为table
	--arg的作用域是func4函数体
	local arg={...}
	local total=0
	for k,v in pairs(arg)
	do 
		total=total+v;
	end
	print(total)
end
func4(1,2,3)
func4(1,2,3,4)
--------------------------------------------
function func5()
	return 99,100
end
--将多返回值,同时赋值给两个变量
local num1,num2=func5()
print(num1,num2)

--丢掉数值接受
local _,n2=func5()
print(n2)

Lua的表(table)相关示例代码:

--Table支持数字索引存储数据
--Table支持字符串索引(关联索引)存储数据
local data={one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}
print(data[2])
print(data["one"])
print(data.two)

data.func1=function()
	print("data表中的func1函数")
end
--所以data.func1调用数据,是个函数,也就调用了函数
data.func1()
-----------------------------------------------------
data.func2=function()
	print(data.two)
end
data.func2()
-----------------------------------------------------

--第一种self调用写法
--成员函数定义时,显示加入self变量,对应C#的this关键字
--函数内部可以通过self变量获取当前table的其他值或函数
data.func3=function(self)
	print(self.two)
end
--调用时,必须使用":",因为":"调用,会对self关键字赋值
data:func3()
-----------------------------------------------------
--第二种self调用写法
--隐式给self赋值
function data:func4()
	print("func4:"..self.two)
end
data:func4()

Lua的require语法相关示例代码:

--实现代码的切分

--将提供的Lua文件中的代码执行一下
--文件名中包含特殊字符,比如".",会导致加载错误
--文件扩展名".lua"不需要编写,因为会自动添加
require("HelloWorld")

--表会记录已经加载的文件记录
print(package.loaded["requireTest"])
package.loaded["requireTest"]=nil
--当每次加载文件时,都会检查package.loaded里面的内容,防止重复加载
--package.loaded存储的是加载的路径字符串
--所以如果想重复多次加载一个文件,则需要再次加载前清除这个状态
require("requireTest")

--加载文件的相对路径
--"./"表示当前编写的Lua文件,所在的目录
--"../"表示当前编写的lua文件,所在的上级目录

--获取另一个文件的局部变量
--子文件的return会返回给主文件的变量
local config=require("config")
print(config.appName)

--全局变量可以跨文件直接获取,但十分不推荐(安全性低,极容易被覆盖)

此为config文件中的内容 

Lua元表相关示例及代码:

local t1={1,2,3}

--直接打印表,显示的是内存地址
--希望打印table时,以人类易于阅读的结构显示例:{1,2,3},方
--便调试

--打印时,就是将表作为字符串输出
--实现的功能,当需要将表作为字符串使用时,应该有一种办法
--这种办法,Lua提供了这种语法特性,metatable扩展,元表扩展
print(t1)

local meta={
	--用于扩展t1的元表,只要在元表中实现一些特殊的函数,
	--则t1就可以实现一些特殊功能,比如让t1作为字符串可以使用
	__tostring=function(t)   --元方法,当被扩展的表被以string方式调用时,调用
			local format="{"
			for k,v in pairs(t)
			do 
				format=format..v..","
			end
			format=format.."}"
			return format
		end
}
setmetatable(
	t1,    --需要进行元表扩展的数据表
	meta
)
setmetatable(
	t2,    --需要进行元表扩展的数据表
	meta
)
--t1会被传递给t
print(t1)
print(t2)

 Lua小实践

获得不规则Table的准确长度

local TOOL={}
function TOOL:table_count(t)
	local count=0
	for k,v in pairs(t)
	do
		count=count+1
	end
	return count
end

local data={one="cc","aa","bb,",[4]=3,[-1]=4,["two"]="dd"}
print(TOOL:table_count(data))

使用函数将无固定值的参数进行排序(冒泡排序法),并返回参数个数 

function maopao(...)
	local nums={...}
	--print(nums[1])
	for i = 1,#nums
	do
		for j = 1,#nums-i
		do
			if(nums[j]>nums[j+1])
			then
				local tmp=nums[j]
				nums[j]=nums[j+1]
				nums[j+1]=tmp
			end
		end
	end
	return #nums,nums
end

local l,t = maopao(7,1,23,8,99,26)
print(l)
print("------------------------------------")
print(t[1])
print(t[2])
print(t[3])
print(t[4])

使用元表的_add元方法,实现两个Table的所有元素的合并 

local t1 = {1,2,3}
local t2 = {4,5,6}

local meta={
	__add=function(t1,t2)
		local new_t={}
		for k,v in pairs(t1)
		do 
			--将数据插入到一个表中,List.Add()
			table.insert(new_t,v)
		end

		for k,v in pairs(t2)
		do 
			table.insert(new_t,v)
		end
		return new_t
	end,
	__tostring=function(tt)
		local format="{"
		for k,v in pairs(tt)
		do 
			format = format..v..','
		end
		format=format.."}"
		return format
	end
}
setmetatable(t1,meta)

local t3 = t1 + t2
setmetatable(t3,meta)
print(t3)

该系列专栏为网课课程笔记,仅用于学习参考。

http://www.dtcms.com/a/112451.html

相关文章:

  • 4.5/Q1,GBD数据库最新文章解读
  • ✅ 2025最新 | YOLO 获取 COCO 指标终极指南 | 从标签转换到 COCOAPI 评估 (训练/验证) 全覆盖【B 站教程详解】
  • NHANES指标推荐:DI-GM
  • ARM 协处理器(Coprocessor)功能及用法详解
  • vue3 字符串里面有变量 反引号(``)来定义模板字符串,并且hello,world来简单说明
  • 修改Jupyter Notebook主目录文件夹
  • WHAT - CSS 伪元素
  • 数字孪生技术之争:UE、Unity还是飞渡DTS数字孪生平台?
  • uniapp实现的简约美观个人中心页面(仿小红书)
  • Qt 事件系统负载测试:深入理解 Qt 事件处理机制
  • Mysql 中的索引
  • 文件或目录损坏且无法读取:数据恢复的实战指南
  • Mysql 分库分表 vs 分区
  • 每天认识一个设计模式-外观模式:化繁为简的接口魔法
  • 【Java】List列表和数组有什么区别?应用场景有哪些?
  • 免费远程软件实现手机操控电脑的新手教程来了
  • 【centos】经常使用的脚本
  • 并发上传及 JS 的单线程特性
  • Scala总结(四)
  • 基于SpringBoot的水产养殖系统【附源码】
  • 双轴注意力+多分辨率成像:TIMEMIXER++在时序建模领域再创佳绩
  • ffmpeg 使用不同编码器编码hevc的速度
  • 睡不着锻炼贴士补充
  • AI时代下的代理IP新机遇:解锁数据、安全与效率的隐形密码
  • 哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
  • 【力扣hot100题】(052)课程表
  • 零基础快速部署网站:使用宝塔面板一键安装 LNMP/LAMP 环境实战教程
  • 从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人
  • WPF 登录页面
  • 基于 SpringBoot 的社区维修平台