load在加载代码块时,通常使用全局环境去初始化代码块的_ENV上值。

然而,load选项的第四个参数给出的值就是供_ENV用的。(loadfile函数参数也是一样)

举一个有关初始化的例子,假如我们有一个普通的配置文件,定义了一些常量和函数供程序使用。

--file 'config.lua '
width =
height =
...

然后用下面的代码加载:

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

配置文件中的代码就会在空环境env中运行。

有时,需要多次运行同一块代码,每次运行的环境表都不同。

上面的情况中,load的额外参数就满足不着了。有两个选择可以满足该需求:

第一个,使用debug库的debug.setupvalue 函数。允许改变给定函数的任何上值:

f = loadfile(name)
...
env = { }
gebug. setupvalue(f,,env)

该函数的第一个参数是函数,第二个参数是上值的索引,第三个参数是upvalue的新值。

对于修改环境变量的情况:就是针对第一个参数是load 或loadfile 返回的一个函数,Lua会保证它只有唯一的一个_ENV 上值。这时setupvalue 的第二个参数永远是1。

这种情况的选择有一个不好的缺点是依赖debug库。

第二个选择,就是在加载代码前做点手脚。比如加载前加上下面的一行代码:

_ENV = ...

之前提到过,Lua 编译代码块时,把它当作变参函数。因此,上面的那一行代码会被当作chunk代码块的第一个参数。

因此就用它设置了环境。加载完这段代码块,我们再调用执行代码块后的返回函数。该函数就完成了把目标环境当作第一个参数传递过去。例如:

f = loadwithprefix("local _ENV = ...;",io.lines(filename,"*L"))
...
env = {}
f(env)

Chapter 14_5 _ENV和load的更多相关文章

  1. _ENV和_G

    5.1之前, 全局变量存储在_G这个table中, 这样的操作:a = 1 相当于:_G['a'] = 1 但在5.2之后, 引入了_ENV叫做环境,与_G全局变量表产生了一些混淆,需要从原理上做一个 ...

  2. Chapter 14_4 使用_ENV

    因为_ENV是一个普通的变量,我们可以像其他变量一样去对它进行赋值和访问. _ENV = nil 上面的赋值操作,将会使得在它之后的代码块不能直接访问全局变量.不过,对控制你的代码所使用的变量有用处. ...

  3. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger

    Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...

  4. Chapter 3: Connector(连接器)

    一.概述 Tomcat或者称之为Catalina(开发名称),可以简化为两个主要的模块,如下图: 多个Connector关联一个Container.之所以需要多个Connector,是为了处理多种协议 ...

  5. EFFECTIVE OBJECTIVE-C 2.0 TIPS 总结 CHAPTER 1 & CHAPTER 2

    下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更 ...

  6. advanced dom scripting dynamic web design techniques Part One DOM SCRIPTING IN DETAIL CHAPTER 1 DO IT RIGHT WITH BEST PRACTICES

    You’re excited; your client is excited. All is well. You’ve just launched the client’s latest websit ...

  7. advanced dom scripting dynamic web design techniques Chapter 2 CREATING YOUR OWN REUSABLE OBJECTS

    JavaScript is all about objects. Objects are the foundation of everything, so if you’re unfamiliar w ...

  8. Chapter 6 — Improving ASP.NET Performance

    https://msdn.microsoft.com/en-us/library/ff647787.aspx Retired Content This content is outdated and ...

  9. Chapter 7. Dependency Management Basics 依赖管理基础

    This chapter introduces some of the basics of dependency management in Gradle. 7.1. What is dependen ...

随机推荐

  1. USB硬盘 raw之后,DiskGenius 恢复

    最近,为了在E560上安装LINUX(先是gentoo,后是rhel7,最后是 centos7),用UltralISO 把一块移动硬盘给写成RAW格式了.现在又想把移动硬盘给恢复回去.采用一些方法,效 ...

  2. json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

  3. 人工手动冷备不完全恢复介绍(purge表不完全恢复)

    不完全恢复不完全恢复的基本类型:1)基于时间点 (until time): 使整个数据库恢复到过去的一个时间点前2)基于scn (until change): 使整个数据库恢复到过去的某个SCN前3) ...

  4. 五大科技巨头VR/AR专利报告,Magic Leap以22.6%领跑

    在十月份发布的<VR/AR专利技术深度分析报告>指出,VR.AR行业的专利多被佳能.索尼.微软.谷歌等科技巨头"包养",但是并没有对这部分进行详细分析.近日,风投公司C ...

  5. CSS 待解决问题

    记录一些待解决的问题 1. 关于 table 边框参差不齐问题 乍一看表头的边框有 间隙, 下边框也有点没有对其的问题. 解决方案:  给 table 添加: border-collapse: col ...

  6. 使用recordmydesktop进行屏幕录像

    屏幕录像的功能对于分享游戏攻略.演示电脑软件的操作是必不可少的.在Windows下可能一般的用户就下载盗版的商业软件来做了.而在GNU/Linux操作系统下,则有现成的自由软件可供使用,只不过没有图形 ...

  7. Hihocode 1015 KMP算法

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...

  8. Chronodex:视觉时间管理,让你的生活更有序

    我喜欢把时间安排的有条不紊,看看清晰的时间安排心理有种踏实感,只有你是"纸爱好者" - 才能最终寻找完美组织时间的方式方法. 我记得自从我是一个小女孩以来,我喜欢纸和笔和颜色和标记 ...

  9. inception cenOS 安装

    inception手册http://mysql-inception.github.io/inception-document/install/ 执行命令sh inception_build.sh,ce ...

  10. NSCondition用法

    NSCondition用法 使用NSCondition,实现多线程同步...举个列子 消费者跟生产者... 现在传言6s要出了.. 消费者想买6s.现在还没有6s.消费者等待6s生产. 生产了一个产品 ...