Lua学习笔记:require非.lua拓展名的文件

前言
本篇在讲什么

Lua的require相关的内容
本篇需要什么

Lua语法有简单认知
C++语法有简单认知
依赖Visual Studio工具

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈

目录

  • ♠ 前言
  • ♠ 前瞻
  • ♠ require的定义
  • ♠ Lua的加载器
  • ♠ 简单的断点调试
  • ♠ require自定义文件
    • ♥ 修改Lua_Path
  • ♠ 自定义加载器
    • ♥ 自定义
  • ♠ 推送
  • ♠ 结语


♠ 前言

想在Lua代码中去require非.lua后缀的文件,发现需要去自定义一下Lua的加载器,这里我们先从c源码的角度去探究一下require的过程,再自定义一个加载器去加载指定后缀的Lua代码文件


♠ 前瞻

阅读本篇文章需要准备编译Lua源码的工程,详情可参考下面文章

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

阅读本篇文章前最好提前了解C/C++和Lua的交互原理,详情可参考下面文章

Lua学习笔记:C/C++和Lua的相互调用

阅读本篇文章前最好提前了解Lua的package,详情可参考下面文章

Lua学习笔记:探究package

阅读本篇文章前最好提前了解Lua的词法分析,详情可参考下面文章

Lua学习笔记:词法分析


♠ require的定义

require的本质其实是注册在_G内的一个全局函数,在Lua中如果把_G去dump一下,可以看到方法名字在其中

在这里插入图片描述

原型函数定义在源码loadlib.c中,名为ll_require的函数,其在luaopen_package函数中被注册到全局表当中

在这里插入图片描述


♠ Lua的加载器

在Lua初始化的时候定义了几个默认加载器去读取文件内容,在loadlib.c文件中的luaopen_package方法中去初始化了加载器

在这里插入图片描述

其中loader_lua就是用来加载Lua文件的默认加载器,只要是require一个lua文件就默认会执行

在这里插入图片描述


♠ 简单的断点调试

我们预先准备了两个Lua文件,加几个断点来看一下执行流程,Lua代码如下所示

在这里插入图片描述

我们分别在ll_requireloader_Lua函数中添加了断点,在执行后,依次执行了两个函数,最终在luaL_loadfile函数中完成对require文件的词法分析

在这里插入图片描述

在这里插入图片描述


♠ require自定义文件

默认的对Lua的读取只支持.lua后缀的文件,我们可以通过几种不同的方式去改变这一策略


♥ 修改Lua_Path

Lua的package表中字段path留存的就是文件的搜索路径,我们可以通过补充搜索路径来达到目的

在这里插入图片描述

可以直接通过修改源码中的LUA_PATH_DEFAULT定义,去使得Lua程序可以加载.luac结尾的文件,执行后可直接被require

在这里插入图片描述

源码可能并不是能随便修改的,我们也可以直接在Lua代码中为package.path添加搜索路径,如下图所示

在这里插入图片描述


♠ 自定义加载器

如果require的文件后缀不是.lua在require的时候会报错,原因是在默认加载器loader_Lua并没有设定对其他后缀的加载方式,不过我们可以自定义加载器

在这里插入图片描述

在这里插入图片描述


♥ 自定义

如下述代码所示,在执行脚本加载之前,将loaders的默认加载器替换成我们自定义的函数就可以了

int myLuaLoader(lua_State * L)
{std::string filename(luaL_checkstring(L, 1));return 1;
}void addLuaLoader(lua_State * _state, lua_CFunction func)
{if (!func) return;lua_getglobal(_state, "package");                                  /* L: package */lua_getfield(_state, -1, "loaders");                               /* L: package, loaders */lua_pushcfunction(_state, func);                                   /* L: package, loaders, func */for (int i = (int)(lua_objlen(_state, -2) + 1); i > 2; --i){lua_rawgeti(_state, -2, i - 1);                                /* L: package, loaders, func, function */lua_rawseti(_state, -3, i);                                    /* L: package, loaders, func */}lua_rawseti(_state, -2, 2);                                        /* L: package, loaders */lua_setfield(_state, -2, "loaders");                               /* L: package */lua_pop(_state, 1);}int main()
{lua_State* L = luaL_newstate();luaL_openlibs(L);addLuaLoader(L, myLuaLoader);luaL_dofile(L, "lua_src/test.lua");lua_close(L);
}

我们在myLuaLoader函数中加入断点,在执行程序后已经可以获取到对应的文件名字了

在这里插入图片描述

接下来,我们补充函数内容,让其可以去识别到特定后缀的文件,很简单,直接拼接.luac结尾后缀,然后去loadfile,大家可以根据自己需求去扩展

int myLuaLoader(lua_State * L)
{const char *filePath = "D:\\work\\cToLua\\Debug_Lua\\";const char *name = luaL_checkstring(L, 1);const char *suffix = ".luac";char *filename = (char *)malloc(strlen(filePath) + strlen(name)+ strlen(suffix));sprintf(filename, "%s%s%s", filePath, name, suffix);if (luaL_loadfile(L, filename) != 0)return 0;return 1;
}

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146379.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT的截图识别功能测评:开启图像中的文字与信息的新纪元

文章目录 根据截图,识别菜品根据截图,识别数学公式根据截图生成前端UI代码可视化图像复现案例一案例二 更多可以使用的方向 制作人:川川 辛苦测评,如果对你有帮助支持一下书籍:https://item.jd.com/14049708.html 根据…

微信小程序,动态设置三级联动, 省市区街道

1.第一步 传parentId0 查询省份 2.第二步 选择省份,传pathId选择省份的pathId, 不传parentId,会查询出 市/县数据 3.第三步 根据选择县的parentId 查询街道数据,传parentId选择的县id 4.选择结果回显 显示所选择的 path 以/分割 取最后一级<van-dropdown-menu…

wustctf2020_name_your_cat

wustctf2020_name_your_cat Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;开了NX和canary int shell() {return system("/bin/sh"); }有个后门函数 unsigned int…

【量化】量化原理浅析

前言 模型在端侧运行时&#xff0c;会追求模型保持原有精度的同时&#xff0c;让模型的运行速度更快。基本方向为模型压缩和加速&#xff0c;着力于减少网络参数量、降低计算复杂度。可通过以下方式实现&#xff1a; 针对网络结构本身进行改进&#xff0c;常用的3x3的卷积的叠加…

重置Jetson设备的Ubuntu密码:通过挂载根目录到另一个Linux系统

在本文中&#xff0c;我们将介绍如何在忘记Ubuntu 20.04密码的情况下重置密码。我们将通过将Ubuntu的根目录挂载到另一个Linux系统来实现这一目的。我们还将介绍chroot命令的功能。 1. 背景 最近&#xff0c;我们研发团队遇到了一个棘手的问题。一台用于研发&#xff0c;多人使…

大数据Doris(三):Doris编译部署篇

文章目录 Doris编译部署篇 一、Doris编译

云计算安全:保护你的数据免受黑客侵害

文章目录 云计算的崛起云计算安全的挑战1. 数据隐私2. 身份认证和访问控制3. 网络安全4. 云供应商安全 云计算安全的最佳实践1. 数据加密2. 强身份认证3. 访问控制4. 安全审计5. 更新和漏洞管理6. 培训和教育 云计算安全的未来1. 量子安全性2. 人工智能和机器学习3. 边缘计算安…

Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice

安装Onlyoffice 拉取onlyoffice镜像 docker pull onlyoffice/documentserver 查看镜像是否下载完成 docker images 启动onlyoffice 以下是将本机的9001端口映射到docker的80端口上&#xff0c;访问时通过服务器ip&#xff1a;9001访问&#xff0c;并且用 -v 将本机机/data/a…

地理空间探测器保姆级教程-含实现程序-少理论多操作

1.实现软件excel程序 【传送门】 2.基本步骤 2.1 准备的数据样式 按省份地理位置&#xff0c;分为东中西三大板块 2.2 数据离散化 数据不需要标准化、归一化等X&#xff08;X可能多个&#xff09;数据&#xff0c;需要离散化&#xff0c;eg&#xff0c;使用门槛值&#x…

山西电力市场日前价格预测【2023-10-02】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-02&#xff09;山西电力市场全天平均日前电价为355.35元/MWh。其中&#xff0c;最高日前电价为521.18元/MWh&#xff0c;预计出现在18: 45。最低日前电价为309.36元/MWh&#xff0c;预计…

【通意千问】大模型GitHub开源工程学习笔记(1)--依赖库

9月25日&#xff0c;阿里云开源通义千问140亿参数模型Qwen-14B及其对话模型Qwen-14B-Chat,免费可商用。 立马就到了GitHub去fork。 GitHub&#xff1a; GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed b…

14:STM32-----看门狗

目录 一:看门狗 1:WDG 2:独立看门狗 (IWDG) A:IWDG框图 B:IWDG_KR键寄存器 C:IWDG超时时间 3:窗口看门狗 (WWDG) A:WWDG框图 B:WWDG工作特性 C:WWDG超时时间 4:独立看门狗和窗口看门狗的区别 5:数据手册 二:案例 A:独立看门狗 1:连接图 2:步骤 3:函数介绍 3:代…

Python脚本实现xss攻击

实验环境&#xff1a;zd靶场、vscode 知识点 requests.session() 首先我们需要先利用python requests模块进行登录&#xff0c;然后利用开启session记录&#xff0c;保持之后的操作处于同一会话当中 requests.session()用于创建一个会话(session)的实例对象。使用requests库…

Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

效果 直接将脚本挂载在Text Mesh Pro上&#xff0c;但是需要滚动的文本必须在Scroll View中&#xff0c;否侧会定位错误&#xff0c;还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…

1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码

1.RFID概念 RFID是Radio Frequency Identification的缩写&#xff0c;又称无线射频识别&#xff0c;是一种通信技术&#xff0c;可通过无线电讯号识别特定目标并读写相关数据&#xff0c;而无需与被识别物体建立机械或光学接触。 RFID&#xff08;Radio Frequency Identificati…

linux 清除卸载jenkins

1、停服务进程 查看jenkins服务是否在运行&#xff0c;如果在运行&#xff0c;停掉 查看服务 ps -ef|grep jenkins 停掉进程 kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 删掉相关安装目录 rm -rf /root/.jenkins/# 删掉war包 rm -rf /…

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们&#xff0c;你是不是经常为电脑的驱动问题而烦恼&#xff1f;如果是的话&#xff0c;你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前&#xff0c;不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

【夏虫语冰】测试服务器端口是否打开(命令行、Python)

文章目录 1、简介2、命令行2.1 telnet2.1.1 工具简介2.1.2 工具配置2.1.3 工具使用 2.2 curl2.2.1 工具简介2.2.1 工具下载2.2.1 工具使用 2.3 wget2.3.1 工具简介2.3.2 工具下载2.3.2 工具使用 2.4 nc2.4.1 工具简介2.4.2 工具安装2.4.3 工具使用 2.5 ssh2.5.1 工具简介2.5.2 …

动态规划算法(1)--矩阵连乘和凸多边形剖分

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘&#xff1f; 2、动态规划思路 3、手推m和s矩阵 4、完…