Lua(模块与包)

Lua 模块的基本概念

Lua 中的模块是一个由函数、变量组成的代码库,通常保存在独立的 .lua 文件中。模块通过 return 语句导出其内容,供其他脚本调用。模块化设计可以提高代码复用性,便于管理。

创建模块

模块通常以 .lua 文件形式存在,文件内通过 return 返回一个表(table),表中包含模块的公开函数或变量。例如:

-- 文件名为 mymodule.lua
local M = {} -- 模块表function M.add(a, b)return a + b
endfunction M.sub(a, b)return a - b
endreturn M -- 导出模块

加载模块

Lua 5.1 及以上版本使用 require 函数加载模块。require 会搜索模块路径并执行文件,返回模块导出的内容:

local mymodule = require("mymodule") -- 加载模块
print(mymodule.add(1, 2)) -- 调用模块函数

模块搜索路径

require 通过 package.pathpackage.cpath 确定搜索路径。package.path 用于 .lua 文件,package.cpath 用于二进制模块(如 .dll.so)。默认路径包含当前目录和 Lua 安装路径。

print(package.path) -- 查看 Lua 模块搜索路径
print(package.cpath) -- 查看二进制模块搜索路径

模块的局部变量

模块中未暴露的局部变量对外不可见,实现封装:

local M = {}
local privateVar = 100 -- 局部变量,外部不可访问function M.getPrivate()return privateVar
endreturn M

包管理工具

Lua 的包管理工具如 LuaRocks 可以安装和管理第三方模块。安装命令示例:

luarocks install luasocket

模块的缓存机制

require 会缓存已加载的模块,避免重复加载。可以通过 package.loaded 查看或清除缓存:

package.loaded["mymodule"] = nil -- 清除模块缓存
require("mymodule") -- 重新加载

使用环境隔离

模块可以通过设置 _ENV 实现沙盒环境,避免污染全局命名空间:

local M = {}
setmetatable(M, { __index = _G }) -- 继承全局环境
_ENV = M -- 切换环境function add(a, b)return a + b
endreturn M

模块的依赖管理

模块可以依赖其他模块,通过 require 引入:

local json = require("dkjson") -- 引入第三方 JSON 模块
local M = {}function M.toJson(t)return json.encode(t)
endreturn M

动态加载模块

loadfiledofile 可以动态加载模块,但不推荐替代 require

local chunk = loadfile("mymodule.lua") -- 加载但不执行
local M = chunk() -- 执行并获取模块

模块的命名规范

Lua 模块通常使用小写字母和下划线命名,如 my_module.lua。避免与 Lua 关键字冲突。

模块的版本控制

在模块中定义版本号,便于管理:

local M = {}
M._VERSION = "1.0.0"
return M

模块的测试与调试

模块可以通过独立的测试脚本验证功能:

local mymodule = require("mymodule")
assert(mymodule.add(1, 2) == 3)

Lua 5.2 后的模块变化

Lua 5.2 移除了 module 函数,推荐直接使用 return table 的方式定义模块。

模块的打包与分发

将模块打包为 .rocks 文件或直接发布源码,便于其他开发者使用。LuaRocks 支持模块发布:

luarocks pack mymodule

模块的跨平台兼容性

确保模块代码兼容不同操作系统,避免路径硬编码:

local path_sep = package.config:sub(1,1) -- 获取系统路径分隔符
local path = "foo" .. path_sep .. "bar.lua"

模块的元表应用

通过元表为模块添加默认方法或重载操作符:

local M = {}
setmetatable(M, {__add = function(a, b) return a.value + b.value end
})
M.value = 10
return M

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1. boost::asio之socket的创建和连接

网络编程基本流程 网络编程的基本流程对于服务端是这样的 服务端 1)socket——创建socket对象。 2)bind——绑定本机ipport。 3)listen——监听来电,若在监听到来电,则建立起连接。 4)accept——再创建一个…

WPF 控制动画开关

记录一种实现方式:第一步:首先定义一个静态类,提供依赖属性,进而方便在xaml中实现绑定:public static class AnimationBehavior{// 定义附加属性public static readonly DependencyProperty IsAnimatingProperty Depen…

元素竖向的百分比设定是相对于父容器的高度吗?

元素竖向的百分比设定是相对于父容器的高度吗? 核心问题 在CSS中,当设置元素的竖向属性(如height、padding-top等)为百分比值时,其计算基准是父容器的高度还是宽度? 权威结论height属性 百分比值基于父容器…

web3.0怎么入局

Web3.0(第三代互联网)融合了区块链、去中心化应用(DApps)、NFT、DAO等新兴技术,给个人和机构提供了许多全新的赚钱机会。入局 Web3.0 赚钱主要有以下几种途径,根据你的技术背景、资金能力和时间投入可以选择适合自己的方式。 目录 一、普通用户赚钱方式(门槛低) 1. …

linux入门 相关linux系统操作命令(二)--文件管理系统 ubuntu22.04

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址:星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了,可以私信我获取最新兑换码!&a…

Python-初学openCV——图像预处理(二)

目录 一、图像仿射变换 1、基本性质 二、cv2.warpAffine() 函数 1、图像旋转 2、图像平移 3、图像缩放 4、图像剪切 三、 插值方法 1、最近邻插值 2、双线性插值 3、像素区域插值 4、双三次插值 5、Lanczos插值 一、图像仿射变换 仿射变换(Affine Tr…

医疗AI轻量化部署方案的深度梳理与优化路径判研

摘要 医疗AI的快速发展为精准诊断、个性化治疗和医疗资源优化提供了新机遇。然而,大规模模型的高计算复杂度和资源需求限制了其在资源受限环境(如边缘设备、基层医疗机构)的应用。本文系统梳理了医疗AI轻量化部署的核心技术体系,包括模型压缩、参数高效微调(PEFT)、边缘-…

SSP通过SDK对接流量的原理与实现

一、核心概念解析 1.1 SSP(供应方平台) 定义:SSP是程序化广告生态中媒体方的核心工具,通过自动化技术帮助媒体(如网站、应用、视频平台)管理广告资源、优化填充率并最大化广告收益。核心功能:…

如何清理电脑c盘内存 详细操作步骤

电脑使用时间不断延长,许多用户可能会遇到一个问题——C盘空间不足,导致系统运行缓慢或无法安装新程序。如果C盘的存储空间被大量占用,可能会影响到计算机的性能。本文将介绍几种有效的方法,帮助你清理C盘内存,释放空间…

ESP32的ADF详解:5. Streams的API

一、算法流 (algorithm stream) 1. 初始化与配置API功能描述关键参数说明algo_stream_init()初始化算法流(AEC/AGC/NS/VAD)config->algo_mask 选择算法组合config->sample_rate 设置采样率(默认16kHz)config->partition_…

JavaScript对象键序问题解析

问题的发现: 我有一个接口返回一个json数据浏览器network里的Response里是从大到小排。 但Preview就是反过来的 问题的描述: 上面那个让我发现浏览器处理对象或者json是会对其键值对做排序!!! 在JavaScript中&am…

pandas库的数据导入导出,缺失值,重复值处理和数据筛选,matplotlib库 简单图绘制

目录 一.数据导入导出 1.CSV文件读取与参数说明 2.Excel与TST文件读取 3.数据导出操作 二.缺失值处理 1.填充缺失值 2.删除缺失值【删除整行数据】 三.重复值处理 四.数据筛选与条件查询 1.逻辑判断取数 2.字符匹配 3.逻辑运算: &(和&…

FPGA 如何实现另一个 FPGA?

如果你对 FPGA 有些了解,大概知道它的意思是“可编程逻辑器件”,可以把写好的逻辑电路(通常是 Verilog/VHDL)通过工具综合、布局布线、烧写进去,让一块芯片变成“你想要的电路”。但如果我告诉你,现在有个开…

文思助手、新华妙笔 AI材料星的公文写作深度测评

公文写作一直都是体制内工作人员的日常核心任务,写公文的难点不仅来自于对政策表述严谨性的高要求,也在于格式规范、内容深度以及效率压力的多重考验。随着AI技术的发展,越来越多的文字辅助工具出现,很大程度的缓解了写作压力&…

Flutter开发环境搭建与工具链

Flutter开发实战第1章:Flutter开发环境搭建与工具链1.1 Flutter简介与优势Flutter是Google推出的开源UI工具包,用于从单一代码库构建编译为原生性能的移动、Web和桌面应用程序。Flutter的核心优势包括:跨平台一致性:一套代码运行在…

io_uring:Linux异步I/O的革命性突破

目录 1. io_uring是什么? io_uring核心优势: 2. io_uring核心原理 2.1 双环形缓冲区设计 2.2 关键数据结构 1、完成队列CQ 2、提交队列SQ 3、Params 3. io_uring工作流程 3.1 初始化阶段 3.2 I/O操作流程 4. C代码示例(原始系统调…

线段树学习笔记 - 练习题(2)

文章目录1. 前言2. P3870 [TJOI2009] 开关3. P2184 贪婪大陆4. P1438 无聊的数列5. P1471 方差1. 前言 线段树系列文章: 线段树学习笔记。线段树学习笔记 - 练习题(1)。 前一篇做了几道线段树的题目,这篇文章就继续看下线段树的…

Vue状态管理:Pinia 与 Vuex 的使用方法与对比【文章附有完整案例】

最近在接手vue项目的需求,因为之前一直在做react的需求,日常的vue练习也少了很多,导致现在接手vue项目,很多关于vue的知识点基本上忘得干干净净了。但是好在有基础,重新学也会很快掌握。分享这个过程中的一些复习内容。…

OpenMed 项目深度分析:推动医疗 NLP 领域的开源革命

摘要 医疗人工智能(AI)领域因高质量数据和模型的获取受限而发展缓慢。OpenMed 项目通过开源超过380个医疗命名实体识别(NER)模型,显著降低了研究与应用门槛。本文从项目背景、技术优势、应用场景、实施挑战及未来展望五个方面,系统分析 OpenMed 的核心价值与潜力,揭示其…

大模型开发

什么是Ai?AI的全拼是(Artificial Intelligence)人工智能,使机器能够像人类一样思考、学习和解决问题的技术。在AI的应用情况下我们更多的是学习自然语言处理。在自然语言处理(Natural Language Processing,NLP)中,有一项关键技术叫…