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。。。。。

 

posted @ 2020-04-15 00:21  LCAC  阅读(113)  评论(0编辑  收藏  举报