博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全局变量声明的规范化(转)
阅读量:6844 次
发布时间:2019-06-26

本文共 2091 字,大约阅读时间需要 6 分钟。

  Lua将环境本身存储在一个全局变量_G中,(_G._G等于_G)。为了对全局命名空间更好的管理,最好是显示的声明每一个变量,可以通过使用metamethod来改变_G的行为来进行规范:

-- 声明新的变量,使用rawset绕过metamethod的限制-- 保证声明的变量不为nil,如果声明一个nil变量,等于该变量还是不存在,访问该变量的时候还是会触发__indexdeclare = function(name, initval)    rawset(_G, name, initval or false)end--改变全局变量的访问行为setmetatable(_G,     {__newindex = function (_, n)    error("attempt to write to undeclared variable " ..n, 2)    end,        __index = function(_, n)    error("attempt to read undeclared variable "..n, 2)    end,})declare("a")a = 1print(a)    -- 1a = nilprint(a)    -- error 触发__index,因为该变量已经释放了

  上述代码中,每一个变量都需要显示declare,并且不能声明nil变量。

  下面这种方法可以声明nil变量,但需要用一个表来显示的记录每一个声明过的变量:

local declareNames = {}function declare(name, initval)    rawset(_G, name, initval)    declareNames[name] = trueendsetmetatable(_G,     {__newindex = function (t, n, v)        if not declareNames[n] then            error("attempt to write to undeclared var. " ..n, 2)        else            rawset(t, n, v)        end    end,    __index = function (_, n)        if not declareNames[n] then            error("attempt to read undeclared var. "..n, 2)        else                return nil        end    end})declare("a")a = 1print(a)        -- 1a = nilprint(a)        -- nil 还是可以访问

  个人偏向于第一种方法,因为第二种方法中,当一个变量被置为nil以后,实际上该变量已经被释放了,所以将变量的置空操作封装在一个undeclear函数中。对第二种方法的改进:

local declareNames = {}function declare(name, initval)    rawset(_G, name, initval)    declareNames[name] = trueendfunction undeclare(name)    declareNames[name] = nil    rawset(_G, name, nil)endsetmetatable(_G,     {__newindex = function (t, n, v)        if not declareNames[n] then            error("attempt to write to undeclared var. " ..n, 2)        else            rawset(t, n, v)        end    end,    __index = function (_, n)        if not declareNames[n] then            error("attempt to read undeclared var. "..n, 2)        else                return nil        end    end})declare("a")a = 1print(a)        -- 1undeclare("a")print(a)        -- error 变量已经不存在了,会触发__index

  两种方法的代价都很小,可以忽略不计,但是给整个编程环境带来的好处是不言而喻的。

http://www.cnblogs.com/sifenkesi/p/3838311.html

你可能感兴趣的文章
详解JSP九个内置对象
查看>>
MySQL深入03-锁-事务-GTID
查看>>
Linux Kickstart无人值守安装(上)
查看>>
安装libpcap错误处理
查看>>
Effactive Java -- 对于所有对象都通用的方法
查看>>
Android 中文 API (101) —— AsyncTask
查看>>
Silverlight学习笔记之使用TranslateTransform控制对象位置
查看>>
在Web Application中集成CAS登录模块
查看>>
webApp路由控制-vue-router2.0
查看>>
PyQT实现扩展窗口,更多/隐藏
查看>>
阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
查看>>
怎样使视图的标签是波浪形
查看>>
国际版本Office365与国内版本office365的功能介绍
查看>>
网络安全系列之二十七 利用MicroSoft Private Folder加密文件
查看>>
VMware vSphere 5.1 群集深入解析(二十八)- vSphere配置
查看>>
主流的深度学习模型有哪些?
查看>>
HTML语言教程电子书下载 By思念狗的骨头
查看>>
Python进行URL解码
查看>>
Flash播放mp4的两个问题:编码问题和需要下载完后才能播放的问题
查看>>
Ubuntu环境变量解析
查看>>