Lua Packages

Lua 并没有提供明确的机制来实现 packages。然而,我们通过语言提供的基本的机制很容易实现他。主要的思想是:像标准库一样,使用表来描述 package。

基本示例

package的简单方法就是对包内的每一个对象都加包名作为前缀。官方示例代码用complex复数表作为例子来阐述package的基本语法:

Lua 复制代码
complex = {}
function complex.new (r, i) return {r=r, i=i} end

complex.i = complex.new(0, 1)

function complex.add (c1, c2)
    return complex.new(c1.r + c2.r, c1.i + c2.i)
end

function complex.sub (c1, c2)
    return complex.new(c1.r - c2.r, c1.i - c2.i)
end

local c1 = complex.add(complex.new(1,2),complex.new(2,-2))
print(c1.r,c1.i) --3       0
return complex

私有成员local

在成员前添加local修饰符即可实现对这个成员的访问空间仅在这个package内部,并且内部可以不需要再重复写上package名。比如以上例子中的add函数,前面加一个local修饰后的代码结构:

Lua 复制代码
local function add (c1, c2)
    return complex.new(c1.r + c2.r, c1.i + c2.i)
end

local c1 = add(complex.new(1,2),complex.new(2,-2))
print(c1.r,c1.i) --3       0

如若既希望其是公有函数(在package外面可被访问)又不希望其在package内部通过package.的冗余前缀方式访问,则可以直接结合两种方案,在声明时为local,在最后显式链接即可,比如上面的add函数,在最后一行写complex.add = add即可。我们需要注意的是这个定义不能放在函数的定义local function add之前,因为lua是顺序读取文件的,在函数定义之前则会意味着complex.add = nil.

使用全局表

如若不想用local也期望达到以上直接访问的效果(不需要冗余前缀访问),则可以利用setfenv(1,complex)来设置当前环境。此句话的目的就是当前的默认Global环境是complex,如果定义了complex.a = 1,则设置此环境之后的print(a)就是1。由此可在调用函数的时候就不需要package前缀了。当然这里需要注意的是Lua5.4已经不再支持setfenv了。

相关推荐
techdashen35 分钟前
Go设计取舍之六: sync.Mutex正常模式与饥饿模式
开发语言·后端·golang
TunerT_TQ1 小时前
【智能体安全治理|专栏第9期】从“一堆规则”到“数字宪法”:智能体治理的下一个阶段
java·开发语言·安全·开源治理·大模型安全·ai基础设施·智能体安全
Aurorar0rua1 小时前
CS50 x 2024 Notes Algorithms - 07
c语言·开发语言·学习方法
程序员-Benothing1 小时前
Java ForkJoinPool 详解:从分治思想到高性能并行计算
java·开发语言·后端·面试·职场和发展
脚踏实地皮皮晨1 小时前
003006001_WrapPanel控件
开发语言·c#·.net·wpf·visual studio
上海安当技术2 小时前
单点登录 SSO 怎么选协议?SAML 2.0 / OAuth 2.0 / OIDC / CAS 对比与 ERP、OA、CRM 接入实战
java·开发语言
不才不才不不才2 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
mifengxing2 小时前
计算机组成原理——存储器系统
开发语言·考研·计算机组成原理·复习笔记·计算机408
海清河晏1112 小时前
Qt 实战:信号与槽+事件系统
开发语言·c++·qt
脚踏实地皮皮晨3 小时前
003005002_WPF StackPanel 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio