本文主要是介绍Lua程序设计(五十四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境和模块
之前我们提到过模块的缺点之一在于很容易污染全局空间,例如在私有声明中忘记 local 关键字。环境为解决这个问题提供了一种有趣的方式。一旦模块的主程序块有一个独占的环境,则不仅该模块的所有函数共享了这个环境,该模块的全局变量也进入到了这个环境中。
我们可以将所有的公有函数声明为全局变量,这样它们就会自动地进入分开的环境中。模块所要做的就是将这个环境赋值给变量 _ENV。之后,当我们声明函数 add 时,它会变成 M.add:
local M = {}
_ENV = M
function add(c1, c2)return new(c1.r + c2.r, c1.i + c2.i)
end
在上述代码中, add 会从环境中得到 new, 也就是 M.new。
这种方法为模块提供了一种良好的支持,只需要程序员多做一点额外的工作。使用这种方法,完全不需要前缀,并且调用一个导出的函数与调用一个私有函数没有任何区别。即使我们粗心忘记了 local 关键字,也不会污染全局命名空间。相反,它只是让一个私有函数变成了公有函数而已。
为了访问其他模块, 例如,我们可以声明一个保存全局环境的局部变量:
local M = {}
local _G = _G
_ENV = nil
另一种更规范的访问其他模块的做法是只把需要的函数或模块声明为局部变量:
local M = {}local sqrt = math.sqrt
local io = io_ENV = nil --从此以后不能在进行外部访问。
这篇关于Lua程序设计(五十四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!