为什么这个函数 运行 是全局变量,而不是局部变量?

Why does this function run as a global variable, but not as a local one?

将 'eventHandlers.key_up' 定义为全局有效,但将其定义为局部无效。

local event = require "event"

local running = true

local function unknownEvent()
    --
end

local eventHandlers = setmetatable({}, { __index = function () return unknownEvent end })

function eventHandlers.key_up(addr, char, code, playerName)
    if (char == string.byte(" ")) then
      running = false
    end
end

local function handleEvent(eventID, ...)
    if (eventID) then
        eventHandlers[eventID](...)
    end
end

while running do
    handleEvent(event.pull ())
end

这是 OpenComputers mod 为 Minecraft 使用的示例事件处理程序。 'Event' 基本上是一个从计算机中提取信号(在本例中为键盘输入)并告诉计算机如何处理事件的库。

程序基本上在底部的循环中等待,监听一个事件。此示例侦听 'key_up' 事件。该事件还提供了额外的信息,例如键盘地址、按下的字符、按下它的玩家等

在此示例中,按下空格键后抬起('key_down' 事件)在底部中断循环,程序终止。

我对 lua 编码比较陌生,我可以处理相对简单的代码,但我遇到了困难。我有两个问题:

(1) 为什么当 'eventHandlers.key_up' 函数定义为全局函数时有效,但定义为局部函数时无效?

(2) 元表在这段代码中的作用是什么?我一直在研究元表和元方法,但我发现它很难掌握。

Open Computers - API:Event

我得到的错误是这样的:

Line 11: '(' expected near '.'

table eventHandlers 在范围内已经是局部的,所以:

function eventHandlers.key_up(addr, char, code, playerName)

… 正在向这个本地 table 添加一个函数。您也可以这样做:

eventHandlers.key_up = function(addr, char, code, playerName)

…这可能会让这更清楚一点。

Re metatables:这里 setmetatable returns 一个空的 table 和一个包含 __index 元方法的 metatable。每当您尝试访问不在 table.

中的字段时,都会调用 __index 元方法

所以这里如果你写 eventHandlers.blah_blah(),Lua 将不会在 table 中找到 blah_blah,所以如果它会调用这个 __index 元方法存在,它将用 unknownEvent 替换 blah_blah 并调用它,因为我们使用了括号。