美文网首页
Lua全局变量规范化

Lua全局变量规范化

作者: 周瑜_efef | 来源:发表于2018-08-21 12:19 被阅读0次

背景:

我们公司采用toLua框架进行棋牌游戏的开发,在开发过程中发现有滥用lua全局变量的情况,原因是Lua的全局变量不用显示声明就能使用,(比如:Util = LuaFramework.Util ),这种造成的后果是,随着项目功能模块增多,很多新手程序员一不小心就重定义覆盖该全局变量,从而对整个项目而言将是灾难性的,于是得想办法对Lua全局变量的使用进行规范化。

目标:

1.常用模块的全局变量,只能在主模块进行显式声明后才能使用,在项目别的位置使用或定义未经声明的全局变量,则抛出错误。

2.由于我们公司产品采用大厅-子游戏模式,设想:每个子游戏拥有独立的"非全局环境",即使在子游戏中重定义覆盖了某全局变量,比如:(Util = LuaFramework.LogUtil),也不会影响_G("Util")原有的定义。

过程:

在<Lua程序设计 第2版(中文版)>书中【14.2全局变量声明】和【14.3非全局环境】中已经对以上问题进行了探讨,具体的内容大家可以详细看看。

解决方案:

1.对于目标1,引用strict.lua ,他实现了对全局变量的检查,只允许全局变量先声明再使用。

该代码的原理:

1.设置_G的metatable来运行时检测(肯定不能静态检测),当我们对_G表进行更新或者赋值是会触发__newindex 和 __index 元方法,我们在这里进行约束:如果该变量从未显式的声明过,则抛出"assign to undeclared variable" 和 "variable n is not declared" 错误。

2.如何判断某全局变量是否声明过:

debug.getinfo是调试Lua程序时一个很重要很常见的函数,主要用于获取函数调用的基本信息。这个函数的难点在于各个参数的含义。具体用法,直接百度就可以了。

这里用getinfo(2,"s")获取 fills in the fieldssource,linedefined,lastlinedefined,what, andshort_src;(source)

strict.lua定义__declared = {} 存放已经声明过的变量,首先判断该变量是否存在__declared,如果不在再判断linedefined (函数定义的起始行号)是否大于0.,如果大于0则表示该变量未声明,反之则将该变量存入__declared 表.

2.对于目标2:

使用setfenv(f,table):设置一个函数的环境,关于具体的用法可以百度.

注意:

1.一旦改变了环境,所有的全局访问就都会使用新的table。如果新table是空的,那么就会丢失所有的全局变量,包括_G.所有应该先将一些有用的值录入其中

2.使用继承组装新环境

a = 1

local newget = {}

setmetatable(newgt,{__index = _G})

setfenv(1,newgt)

这段代码,新环境从原环境中继承了print和a,然而,任何赋值都发生在新的table中。若误改了一个全局变量也没什么,仍然能通过_G来修改全局变量.

由于函数继承了创建其函数的环境.所以一个程序块若改变了它自己的环境,那么后续由它创建的函数都将共享这个新环境。

修改思路:

1.启动游戏,默认进行_G的沙盒环境。

2.自定义每个子游戏的沙盒环境.Env_Game1.Init(--组安新环境)

3.当子游戏模块载入成功后,触发回调Callback()调用setfenv(0,Env_Game1.GetEnv()):参数0,代表将当前环境切换为指定环境.

4.从子游戏退出至大厅时,切换沙盒环境为_G

相关文章

  • Lua全局变量规范化

    背景: 我们公司采用toLua框架进行棋牌游戏的开发,在开发过程中发现有滥用lua全局变量的情况,原因是Lua的全...

  • Lua中的CAPI概述

    头文件lua.h: Lua提供的基础函数,包括创建Lua环境,调用Lua函数,读写Lua环境中的全局变量,以及注册...

  • 解决滥用lua全局变量

    在开发过程中发现有滥用lua全局变量的情况,原因是Lua的全局变量不用显示声明就能使用,(比如:Util = Lu...

  • C Lua API-栈

    简介 C API 是一组能使用C代码与Lua交互的函数。其中包括读写Lua全局变量、调Lua函数、运行一段Lua代...

  • lua 语法

    print("hello lua"); -- 全局变量num = 300; --局部变量local num = 2...

  • lua语法-变量的定义与使用

    lua语法-变量(全局变量与局部变量) 全局变量:直接定义变量名,并赋值 例如,a = 1;注:用;结束当前语句(...

  • lua变量

    Lua 变量有三种类型:全局变量、局部变量、表中的域。 在lua中,除非用 local 显示声明变量为局部变量,否...

  • lua变量

    能坚持别人不能坚持的,才能拥有别人不能拥有的 一,全局变量 在lua语言中 全局变量 无需声明即可使用,使用未经初...

  • Lua变量

    一、全局变量与局部变量 变量在使用前,必须在代码中进行声明,即创建该变量。Lua 变量有三种类型:全局变量、局部变...

  • xLua学习笔记(二) C#调用Lua代码

    获取全局变量 只需要调用LuaEnv对象Global属性的Get方法即可 描述:代表lua全局环境的LuaTabl...

网友评论

      本文标题:Lua全局变量规范化

      本文链接:https://www.haomeiwen.com/subject/skjdiftx.html