Lua杂项
lua的全局变量全都保存在table里面,名字叫: _G
设置不能访问不存在的全局变量,不能赋值不存在的全局变量
setmetatable(_G, {__index = function(_, n) error("attempt to read undeclared variable" .. n, 2) end , __newindex = function(_, n) error("attempt to write undeclared variable " .. n, 2) end })
在这种情况下该如何给不存在的全局变量赋值以下方法可行么?测试不通过,环境5.3.5
function declare( name, initval ) rawset(_G, name, initval or false) -- 报错 end
2、setfenv 设置全局环境
第一个参数可以是层级,也可以是指定的块
第二个参数是对应的块的全局环境
a = 1
setfenv(1, {g = _G})
则当前全局的a只能通过g.a 的方式访问
除非把a设置成local则不会有影响。
a = 1 local newgt = {} setmetatable(newgt, {__index = _G}) setfenv(1, newgt)
但是。。。。5.3没有了这个函数,换成了_ENV这个函数
上面则替换成
_ENV = newgt
有相同的效果
模块函数
local modname = "name" local M = {} _G[modname] = M package.loaded[modname] = M -- setmetatable(M, {__index = _G}) local _G = _G -- setfenv(1, M) _ENV = M
通过如上的方式可以直接 require "XXXX" 然后模块的名字直接使用name即可
3、面向对象主要是在new的位置
Account = {} function Account:new( o ) o = o or {} setmetatable(o, self) self.__index = self return o end
将Account本身设置为元表,返回的o是新建的一个元表是Account的table;到这里,lua相当于新建了一个实例,当实例o执行 o:new{} 之后,则o从Account继承了new。。。。。