zoukankan      html  css  js  c++  java
  • 关于_ENV(lua5.2 or later)

    问:
     我调用了test模块中的del_env函数,可是main文件里的print并没有消失。


    -- test.lua
    local test = {}
    
    function test.del_env ()
    	_ENV = nil
    end
    
    return test
    
    -- main.lua
    local test = require "test"
    
    test.del_env()
    
    print "after delete _ENV"
    
    答:
     _ENV itself is never a global name in a chunk. 
     _ENV 仅仅是语法糖
     你的文件事实上是一个函数 
    -- test.lua
    local _ENV
    function test.del_env()
      _ENV = nil
    end
    
    return test
    
     你要看成是默认在前面加了一行 local _ENV然后在 load 的时候把当前的 _ENV 塞进去的
     print "after" 事实上是_ENV.print "after"
     你要删外面环境的 _ENV, 应该用  debug.getupvalue 遍历外层函数, 找到 _ENV 置空 
     lua 5.2 已经没有所谓全局变量这样的概念了
     全部东西都是函数
     你 load 一段代码事实上就是一个函数/闭包
     假设你没有显式写 local _ENV 那么 parser 就帮你生成一个(假设你有全局变量语法
    隐式的 _ENV 声明是 parser 帮你搞的
     它的值是 loader 塞进去的
     没有全局变量



  • 相关阅读:
    Python open 读和写
    Sublime Text的使用
    解决MySQL Workbench导出乱码问题
    统计学(一)
    pymysql使用(二)
    使用pymysql(使用一)
    2个Excel表格核对技巧
    用Python读写Excel文件的方式比较
    从零上手Python关键代码
    php面试
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7363511.html
Copyright © 2011-2022 走看看