Lua 全局变量的那些事儿

最近项目查了一个问题,最后发现和_G[moduleName]这个置为nil有关系,找了点资料看看里面的坑还是蛮深的,所以记录一下。

全局环境表 _G

Lua把所有的全局变量都放在一个称为全局环境的表_G中,这个表只是个普通的表。注意_G._G == _G
由于_G是一个普通的表,所以提供了以动态名称访问全局变量的形式,这又是Lua的一种对元编程的支持。

_G[varname] = value,更一般的问题是允许使用动态字段名,如_G[“read.io”]默认是不会取出read模块的io字段的,但是使用下面这样实现:

继续阅读

了解Lua metatable 元表

参考lua手册,metatable是被译作元表,Lua 中的每个值都可以用一个 metatable。这个 metatable 就是一个原始的 Lua table,它用来定义原始值在特定操作下的行为。

metatable

一个 metatable 可以控制一个对象做数学运算操作、比较操作、连接操作、取长度操作、取下标操作时的行为,metatable 中还可以定义一个函数,让 userdata 作垃圾收集时调用它。对于这些操作,Lua 都将其关联上一个被称作事件的指定健。当 Lua 需要对一个值发起这些操作中的一个时,它会去检查值中 metatable 中是否有对应事件。如果有的话,键名对应的值(元方法)将控制 Lua 怎样做这个操作。

继续阅读

Git 常用命令用法:程序员的场景

Git 相比 Subversion,无论概念上还是使用上,复杂度其实是高出一个等级的。为什么这么说?分别看下 git help -asvn help 命令清单的对比,单按这个来看,就如果要掌握所有命令的用法,Git 的学习曲线绝对是比 Subversion 高的。尽管如此,但还是有越来越多项目开始用 Git 来做源码管理了。

实际中,我们用到的的 Git 命令还是很有限的,可能也就 git help 中那些而已。下面就类似 SVN命令用法:程序员的场景 一样,结合实际场景说下 Git 的常用命令用法。

继续阅读