当我们在全局环境中定义变量时经常会有命名冲突,尤其是在使用一些库的时候,变量声明可能会发生覆盖,这时候就需要一个非全局的环境来解决这问题。setfenv函数可以满足我们的需求。

  setfenv(f, table):设置一个函数的环境

  (1)当第一个参数为一个函数时,表示设置该函数的环境

  (2)当第一个参数为一个数字时,为1代表当前函数,2代表调用自己的函数,3代表调用自己的函数的函数,以此类推

  所谓函数的环境,其实一个环境就是一个表,该函数被限定为只能访问该表中的域,或在函数体内自己定义的变量。下面这个例子,设定当前函数的环境为一个空表,那么在设定执行以后,来自全局的print函数将不可见,所以调用会失败。

-- 一个环境就是一个表,该表记录了新环境能够访问的全部域
newfenv = {}
setfenv(1, newfenv)
print(1)        -- attempt to call global `print' (a nil value)

  我们可以这样继承已有的域:

a = 10
newfenv = {_G = _G}
setfenv(1, newfenv)
_G.print(1)        -- 1
_G.print(_G.a)        -- 10
_G.print(a)        -- nil 注意此处是nil,新环境没有a域,但可以通过_G.a访问_G的a域

  可以看到,新环境中可以访问_G,但有一点就是_G中的所有函数必须手动调用,这样其实很不方便。我们可以使用metatable来对上述代码进行改进:

-- 任何赋值操作都对新表进行,不用担心误操作修改了全局变量表。另外,你仍然可以通过_G修改全局变量:
newfenv = {}
setmetatable(newfenv, {__index = _G})
setfenv(1, newfenv)
print(1)        -- 1 新环境直接继承了全局环境的所有域,好处:可以不需要通过_G来手动调用

  这样,当访问到函数中不存在的变量时,会自动在_G中查找。对于当前函数和_G都存在的变量,可以通过是否用_G显示调用来区分,比如如果有两个a,那么_G.a表示继承来的,a就是当前函数环境的。

  另外,可以通过getfenv(f)函数查看函数所处的环境,默认会返回全局环境_G。

设置函数环境——setfenv相关推荐

  1. 设置函数环境——setfenv(转)

    当我们在全局环境中定义变量时经常会有命名冲突,尤其是在使用一些库的时候,变量声明可能会发生覆盖,这时候就需要一个非全局的环境来解决这问题.setfenv函数可以满足我们的需求. setfenv(f, ...

  2. Lua中的函数环境、_G及_ENV

    lua5.1中的全局环境变量 Lua将环境table保存在一个全局变量_G中,可以对其访问和设置.一般我们把需要被访问的对象和函数等放到这里, 然后我们可以在需要时通过它来访问和使用. 可以通过val ...

  3. Go 学习笔记(44)— Go 标准库之 os(获取文件状态、获取/修改文件权限、创建、删除目录和文件、获取进程ID、设置获取环境变量)

    1. 概述 os 包提供了操作系统函数的不依赖平台的接口.失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.例如,如果某个使用一个文件名的调用(如Open.Stat)失败了,打印错误时会包含 ...

  4. python3 设置函数执行超时 eventlet模块

    实际项目中会涉及到需要对有些函数的响应时间做一些限制,如果超时就退出函数的执行,停止等待. 可以利用python中的装饰器实现对函数执行时间的控制. python装饰器简单来说可以在不改变某个函数内部 ...

  5. centos设置java环境变量,CentOS设置环境变量

    查看环境变量 查看某个环境变量的值,需要使用 "echo $环境变量名". echo命令用于在终端输出字符串或者变量的值,格式如下: echo [字符串 | $变量名] 常见的环境 ...

  6. python需要配置环境变量吗_python需要设置哪些环境变量?我只知道一个PYTHONHOME指向安装目录。(python详细安装教程 path)...

    怎么把Python文件夹添加进Path中 "我的电脑"点右键,"属性" "高级","环境变量","系统变量&q ...

  7. python cx_oracle配置_用Python设置cx_Oracle环境变量

    cx_Oracle for Python要求在适当的位置设置某些环境变量,以便正确导入和工作.我不想用bash脚本来包装我的应用程序,我以前也做过这样的工作,我只想用Python来设置变量. 下面是我 ...

  8. 【linux】查看环境变量|getenv setenv设置获取环境变量

    目录 环境变量类型 查看环境变量 系统的环境变量 进程的环境变量 初始化时载入的环境变量 执行过程中设置的环境变量 环境变量原理 通过函数存取环境变量 getenv & setenv 获取&a ...

  9. linux环境oracle环境变量,Linux下设置oracle环境变量

    Linux设置Oracle环境变量 方法一:直接运行export命令定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新s ...

最新文章

  1. Field types
  2. apache 重定向tomcat端口_Tomcat
  3. 第一次冲刺对各组的评价
  4. Intelij IDEA 2016.3安装mybatis插件并激活教程
  5. Liststring里 每个元素重复了多少次
  6. pycharm中使用anaconda中python环境
  7. abap--关于sap地址,传真,邮箱的地址读取
  8. 求最高、最低、平均分
  9. 项目参与度较低怎么办?
  10. 一文讲清数据治理、数据管理、数据资产管理区别,数据专家必看
  11. android 应用区高度,Android创建显示区高度可以调整的ScrollView
  12. 【英语学习】【English L06】U03 House L1 What type of apartment do you want to rent?
  13. mysql访问被拒绝1045_mysqlimport:错误:1045,访问被拒绝
  14. 360安全卫士v3.0beta3版发布!
  15. Linux记录-重启后磁盘丢失问题解决方案
  16. Sublime text2 插件推荐
  17. android 互传文件,堪比隔空投送!iPhone和安卓、PC互传文件的3种方法,建议收藏...
  18. Linux命令 常见命令 详细分类
  19. QT OpenGL(一 VAO、VBO、EBO使用)
  20. 如何将代码上传到gitee

热门文章

  1. 三方库报错真的就没有办法了吗?
  2. 2020移动apn接入点哪个快_手机推荐:为什么别人的手机4G网总是比你快?这样设置一下,网速立马飙升...
  3. 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈
  4. centos 编译 mysql_centos 编译安装mysql
  5. Android Wifi 启动过程,AndroidP wifi启动流程
  6. 伽卡他卡电子教室 百度百科_怎么创建人物百度百科?人物百度百科创作技巧...
  7. android组合动画还原,Android - Fragment,View动画,组合动画,属性动画
  8. vue判断a是否可点击_判断 a 和 b 里面元素是否一致:一致输出True,否则输出False...
  9. Caffe学习系列(1):安装配置ubuntu14.04+cuda7.5+caffe+cudnn
  10. Spring - Java/J2EE Application Framework 应用框架 第 6 章 集成AspectJ