_ENV 和 load

简介: _ENV 和 load

函数 load 通常把被加载代码段的上值 _ENV 初始化为全局变量。不过,函数 load 还有一个可选的第四个参数来让我们为 _ENV 指定一个不同的初始值(函数 loadfile 也有一个类似的参数)。


例如,加入我们有一个典型的配置文件,该配置文件定义了程序要使用的几个常量和函数,如下:

-- 文件'config.lua'
width = 200
height = 300
...


可以使用如下的代码加载该文件:

env = {}
loadfile("config.lua", "t", env)()


配置文件中的所有代码会运行在空的环境 env 中,类似于某种沙盒。特别地,所有的定义都会进入这个环境中。即使出错,配置文件也无法影响任何别的东西,甚至是恶意的代码也不能对其他东西造成任何破坏。除了通过消耗 CPU 时间和内存来制造拒绝服务(Denial of ServiceDOS)攻击,恶意代码也做不了什么其他的事。


有时,我们可能像重复运行一段代码数次,每一次使用一个不同的环境。在这种情况下,函数 load 可选的参数就没有用了。此时,我们有另外两种选择。


第一种选择是使用调试库中的函数 debug.setupvalue 。顾名思义,函数 setupvalue 允许改变任何指定函数的上值,例如:

f = load("b = 10; return a")
env = {a = 20}
debug.setupvalue(f 1, env)
print(f())                        --> 20
print(env.b)                      --> 10


setupvalue 的第一个参数是指定的函数,第二个参数是上值的索引,第三个参数是新的上值。对于这种用法,第二个参数永远是 1 :当函数表示的是一段代码时, Lua 语言可以保证它只有一个上值且上值就是 _ENV


这种方式的一个小缺点在于依赖调试库。调试库打破了有关程序的一些常见假设。例如, debug.setupvalue 打破了 Lua 语言的可见性规则,而可见性规则可以保证我们不能从词法定界的范围外访问局部变量。


另一种在几个不同环境中运行代码的方式是每次加载代码段时稍微对其进行一下修改。假设我们在要加载的代码段前加入一行:

_ENV = ...;


注意

由于 Lua 语言把所有的代码段都当做可变长参数函数进行编译,因此,多出的这一行代码会把传给代码段的第一个参数赋值给 _ENV ,从而把参数设为环境。

目录
相关文章
|
Web App开发 缓存 JavaScript
【安装指南】nodejs下载、安装与配置详细教程
这篇博文详细介绍了 Node.js 的下载、安装与配置过程,为初学者提供了清晰的指南。读者通过该教程可以轻松完成 Node.js 的安装,了解相关配置和基本操作。文章首先介绍了 Node.js 的背景和应用场景,随后详细说明了下载安装包、安装步骤以及配置环境变量的方法。作者用简洁明了的语言,配以步骤图示,使得读者能够轻松跟随教程完成操作。总的来说,这篇文章为初学者提供了一个友好的入门指南,使他们能够顺利开始使用 Node.js 进行开发。
5938 2
【安装指南】nodejs下载、安装与配置详细教程
|
5月前
|
消息中间件 人工智能 决策智能
AgentScope x RocketMQ:构建多智能体应用组合
AgentScope是阿里开源的多智能体开发框架,支持模块化、透明化、可定制的智能体构建。集成RocketMQ实现高效A2A通信,助力打造如“智能旅行助手”等复杂协作应用,推动开发者友好型AI生态发展。
|
9月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
605 18
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
1204 155
|
存储 编译器 程序员
【C语言】auto 关键字详解
`auto` 关键字用于声明局部变量的自动存储类,其作用主要体现在变量的生命周期上。尽管现代C语言中 `auto` 的使用较少,理解其历史背景和作用对于掌握C语言的存储类及变量管理仍然很重要。局部变量默认即为 `auto` 类型,因此在实际编程中,通常不需要显式声明 `auto`。了解 `auto` 关键字有助于更好地理解C语言的存储类及其在不同场景中的应用。
823 1
|
存储 资源调度
在 Pinia 中如何实现状态持久化?
在 Pinia 中如何实现状态持久化?
3042 57
|
机器学习/深度学习 人工智能 算法
【深度学习】python之人工智能应用篇——图像生成技术(二)
图像生成是计算机视觉和计算机图形学领域的一个重要研究方向,它指的是通过计算机算法和技术生成或合成图像的过程。随着深度学习、生成模型等技术的发展,图像生成领域取得了显著的进步,并在多个应用场景中发挥着重要作用。
795 9
|
缓存 前端开发 开发者
动态样式问题之@ant-design/cssinjs优化性能如何解决
动态样式问题之@ant-design/cssinjs优化性能如何解决
|
机器学习/深度学习 人工智能 算法
【AI系统】AI 框架与编译器的作用
AI框架如PyTorch和TensorFlow提供丰富的API,简化神经网络模型的实现与训练,抽象硬件操作并自动管理内存。AI编译器将高级语言编写的模型转换为硬件可执行代码,通过多层次优化提升性能。这使得算法工程师可以专注于模型设计与创新,而无需关注底层计算细节。AI框架和编译器不仅提高开发效率,还能充分利用硬件资源,是推动AI系统性能提升的关键技术。访问昇腾社区官网或下载APP,获取更多AI学习资源和参与各类活动。
766 0
|
前端开发 Python
python制作七夕音乐贺卡
本篇博文是一个关于制作音乐贺卡的教程。自己在去年的在七夕节期间创作了一个代码项目,允许用户自定义背景、音乐和祝福语,生成一个包含音乐的HTML贺卡。教程分为三个部分:前言、制作流程和具体代码。前言提到,由于找不到现成的音乐贺卡模板,我决定自己动手,制作的贺卡适用于各种节日。制作流程包括两个步骤,一是通过提供的Python代码工具选择背景图片、音乐文件和输入祝福语,生成HTML贺卡;二是提供了一个预打包的exe文件,用户可以直接运行并按照提示操作。最后,文章分享了生成贺卡的具体Python代码,并以一句鼓励的话语结尾,强调了努力和选择的重要性。