Chapter 14_5 _ENV和load
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的更多相关文章
- _ENV和_G
5.1之前, 全局变量存储在_G这个table中, 这样的操作:a = 1 相当于:_G['a'] = 1 但在5.2之后, 引入了_ENV叫做环境,与_G全局变量表产生了一些混淆,需要从原理上做一个 ...
- Chapter 14_4 使用_ENV
因为_ENV是一个普通的变量,我们可以像其他变量一样去对它进行赋值和访问. _ENV = nil 上面的赋值操作,将会使得在它之后的代码块不能直接访问全局变量.不过,对控制你的代码所使用的变量有用处. ...
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...
- Chapter 3: Connector(连接器)
一.概述 Tomcat或者称之为Catalina(开发名称),可以简化为两个主要的模块,如下图: 多个Connector关联一个Container.之所以需要多个Connector,是为了处理多种协议 ...
- EFFECTIVE OBJECTIVE-C 2.0 TIPS 总结 CHAPTER 1 & CHAPTER 2
下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更 ...
- 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 ...
- 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 ...
- Chapter 6 — Improving ASP.NET Performance
https://msdn.microsoft.com/en-us/library/ff647787.aspx Retired Content This content is outdated and ...
- Chapter 7. Dependency Management Basics 依赖管理基础
This chapter introduces some of the basics of dependency management in Gradle. 7.1. What is dependen ...
随机推荐
- openstack私有云布署实践【10.1 计算nova - kxcontroller节点配置(科兴环境)】
一.首先登录kxcontroller1创建kx_nova数据库,并赋于远程和本地访问的权限. mysql -u root -p CREATE DATABASE kx_nova; GRANT ...
- auDemo
Option Explicit Private Const MODULE_NAME = "auDemo.WSC" Dim oEccomOperation,dbDemo Set oE ...
- MVC之联动学习
一,数据库表设计 CREATE TABLE [dbo].[HY_Province]( [id] [INT] NOT NULL, [province] [NVARCHAR]() NOT NULL, CO ...
- C#异常性能影响
何谓异常 很多人在讨论异常的时候很模糊,仿佛所谓异常就是try{}catch{},异常就是Exception,非常的片面,所以导致异常影响性能,XXXX……等很多奇怪的言论,所以在此我意在对异常正名. ...
- hdu 3410 Passing the Message(单调队列)
题目链接:hdu 3410 Passing the Message 题意: 说那么多,其实就是对于每个a[i],让你找他的从左边(右边)开始找a[j]<a[i]并且a[j]=max(a[j])( ...
- 按键精灵http.定义getWeb
Function 取网页源码(URL) Set objXML=CreateObject("Microsoft.XMLHTTP") objXML.Open "Get&quo ...
- asp.net MVC Session锁的问题
一直在用Session,对Session锁并没有太多的关注,可能是平时没有注意.前段时间突然发现,一个Ajax Get请求,直接访问地址,只需要几十ms,但是在页面中加载,却需要2s.最后定位到Ses ...
- centos 设置删除提示
centos 设置删除.覆盖提示 相信好多用linux的同学都用过cp这个命令来覆盖文件,但是新建的普通用户不会有任何提示,这时候心里就咯噔一下,赶紧看看新文件的是不是传上去了.如果加上提示,是不是就 ...
- 【转载】javadoc学习笔记和可能的注意细节
转载自:http://www.cnblogs.com/xt0810/p/3630996.html [前面的话] 这次开发项目使用jenkins做持续集成,PMD检查代码,Junit做单元测试,还会自动 ...
- Winform 无边框窗口移动自定义边框粗细颜色
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...