跳转至内容

17. 冒号,全局表,局部变量

全力做 BYTEPATH 的教程。

冒号 :

lua
function createCounterTable()
    return {
        value = 1,
        increment = function(self) self.value = self.value + 1 end,
    }
end

function love.load()
    counter_table = createCounterTable()
    counter_table:increment()
end

其中 counter_table:increment() 等价于 counter_table.increment(counter_table),所以调用后 value 会变成 2。

如果我们定义第二张表 counter_table2,将其 .value 定义为 5,调用 counter_table.increment(counter_table2),则 counter_table2.value 会变成 6,而 counter_table.value 仍然是 1。

全局表

Lua 的全局表名为 _G ,它保存着 Lua 中所有全局变量的引用。

每当你定义一个新变量,例如 a = 5,你实际上是在说 _G['a'] = 5,你可以通过 _G.a 来访问变量 a

局部变量的类

lua
local ClassName = Object:extend()
...
return ClassName

只需要找到 object_name 也就是最后一个 / 之后的名字,塞到全局变量 _G 里即可。

lua
local file = file:sub(1, -5)
local last_forward_slash_index = file:find("/[^/]*$")
local class_name = file:sub(last_forward_slash_index+1, #file)
_G[class_name] = require(file)

这里还可以做的一件事是卸载之前加载过的类。虽然这可能永远不会用到。在调用 require(file) 之前,先调用 package.loaded[file] = nil ,就可以清除缓存中所有已加载的文件,并强制重新加载该文件。这在很多情况下都很有用,例如当我们想要实现代码的热重载时。