模块和包

简介: 模块和包

通常, Lua 语言不会设置规则。相反, Lua 语言提供的是足够强大的机制供不同的开发者实现最适合自己的规则。当然,这种方法对于模块而言并不是特别使用。模块系统的主要目标之一就是允许不同的人共享代码,缺乏公共规则就无法实现这样的共享。


Lua 语言从 5.1 版本开始为模块和包(模块的集合)定义了一系列的规则。这些规则不需要从语言中引入额外的功能,程序员可以使用目前为止我们学习到的机制实现这些规则。程序员也可以自由地使用不同的策略。当然,不同的实现可能会导致程序不能使用外部模块,或者模块不能被外部程序使用。


从用户观点来看,一个模块就是一些代码(要么是 Lua 语言编写的,要么是 C 语言编写的),这些代码可以通过函数 require 加载,然后创建和返回一个表。这个表就像是某种命名空间,其中定义的内容是模块中导出的东西,比如函数和常量。


例如,所有的标准库都是模块。我们可以按照下列的方法使用数学库:

local m = require "math"
print(m.sin(3.14))


独立解释器会使用跟如下代码等价的方式提前加载所有标准库:

math = require "math"
string = require "string"
...


这种提前加载使得我们可以不用费劲德编写代码来加载模块 math 就可以直接使用函数 math.sin


使用表来实现模块的显著优点之一是,让我们可以像操作普通表那样操作模块,并且能利用 Lua 语言的所有功能实现额外的功能。在大多数语言中,模块不是第一类值(即他们不能被保存在变量中,也不能被当做参数传递给函数等),所以这些语言需要为模块实现一些专门的机制。而 Lua 语言中,我们则可以轻易地实现这些功能。


例如,用户调用模块中的函数就有几种方法,其中常见的方法是:

local mod = require "mod"
mod.foo()


用户可以为模块设置一个局部名称:

local m = require "mod"
m.foo()


也可以为个别函数提供不同的名称:

local m = require "mod"
local f = m.foo
f()


还可以只引入特定的函数:

local f = require "mod".foo     -- (require("mod")).foo
f()


上述这些方法的好处是无需语言的特别支持,他们使用的都是语言已经提供的功能。

目录
相关文章
|
编解码 缓存 自然语言处理
「Mac畅玩鸿蒙与硬件8」鸿蒙开发环境配置篇8 - 应用依赖与资源管理
本篇将介绍如何在 HarmonyOS 项目中高效管理资源文件和依赖,以确保代码结构清晰并提升应用性能。资源管理涉及图片、字符串、多语言文件等,通过优化文件加载和依赖管理,可以显著提升项目的加载速度和运行效率。
383 1
「Mac畅玩鸿蒙与硬件8」鸿蒙开发环境配置篇8 - 应用依赖与资源管理
|
存储 人工智能 搜索推荐
推荐 8 款必备生产力的实用工具与网站✨
【10月更文挑战第2天】大家好!今天我想和大家分享一些我每天使用的超级实用工具。这些工具已经成为我工作流程中不可或缺的一部分,帮助我更好地保持条理,提高效率,并完成更多任务!
338 1
推荐 8 款必备生产力的实用工具与网站✨
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
462 1
|
SQL 存储 算法
【数据库SQL server】数据库系统概述与DBS结构
【数据库SQL server】数据库系统概述与DBS结构
414 0
【数据库SQL server】数据库系统概述与DBS结构
|
Dubbo 应用服务中间件
Dubbo的Zookeeper单机配置和Zookeeper集群配置
Zookeeper单机配置: 方式一、 <dubbo:registry address="zookeeper://10.20.153.10:2181"/> 方式二、 <dubbo:registry protocol="zookeeper" address="10.
10120 0
|
存储 JavaScript
MATLAB实战 | 求矩阵指数、预定义变量i和j的含义以及梯形积分法
MATLAB实战 | 求矩阵指数、预定义变量i和j的含义以及梯形积分法
539 0
MATLAB实战 | 求矩阵指数、预定义变量i和j的含义以及梯形积分法
|
存储 机器学习/深度学习 安全
Linux加强篇007-使用RAID与LVM磁盘阵列技术
山重水复疑无路,柳暗花明又一村
698 0
Linux加强篇007-使用RAID与LVM磁盘阵列技术
|
弹性计算 固态存储 NoSQL
阿里云高效云盘、可选云盘、ESSD云盘指的是什么?如何选择?
当我们通过阿里云服务器活动下单购买云服务器产品时候,云盘通常有高效云盘、可选云盘、ESSD云盘可选,对于很多新手用户来说,并不清楚这三种云盘分别指的是什么,也不清楚应该如何选择,下面小编来谈谈自己的看法,仅供参考借鉴。
5097 0
阿里云高效云盘、可选云盘、ESSD云盘指的是什么?如何选择?
|
弹性计算 数据挖掘 测试技术
龙蜥一站式质量协作平台T-One上线,助你轻松完成测试
T-One 保障 Anolis OS 版本质量的同时,也为个人开发者、合作企业、SIG 组织等提供测试服务。此外,还支持龙蜥社区的发布测试、Nightly 测试、生态软件 CI 以及自定义测试服务等等。
龙蜥一站式质量协作平台T-One上线,助你轻松完成测试
|
XML Android开发 数据格式
Android RatingBar的基本使用和自定义样式
Android RatingBar的基本使用和自定义样式
Android RatingBar的基本使用和自定义样式