问题

Lua中创建全局变量,可以直接创建

1
2
a = 1
print(a)

而Lua版cocos不可以,必须使用cc.exports

1
2
cc.exports.a = 1
print(a)

lua是支持a = 1写法的,那cocos是如何实现这个限制的呢?
相关源码位于 cocos/scripting/lua-bindings/script/framework/init.lua

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- export global variable
local __g = _G
cc.exports = {}
setmetatable(cc.exports, {
__newindex = function(_, name, value)
rawset(__g, name, value)
end,

__index = function(_, name)
return rawget(__g, name)
end
})

-- disable create unexpected global variable
function cc.disable_global()
setmetatable(__g, {
__newindex = function(_, name, value)
error(string.format("USE \" cc.exports.%s = value \" INSTEAD OF SET GLOBAL VARIABLE", name), 0)
end
})
end

解析

  • 创建全局变量,是将变量放进了_G
  • 创建变量,调用的是_G__newindex函数,通过重写这个方法,实现限制全局变量的创建
  • 取变量值,调用的是_index方法
  • cc.exports重写以上两个方法,实现存取全局变量功能

变量在表里,方法在表里,取值赋值也在表里。如上,可以看出这里可以看出Lua一切都是表的哲学思想。