将'eventHandlers.key_up'定义为全局工作,但将其定义为local不会。
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 for Minecraft使用的示例事件处理程序。 “事件”基本上是一个从计算机中提取信号的库(在这种情况下是键盘输入),并告诉计算机如何处理事件。
该程序基本上在底部的循环中等待,监听事件。此示例侦听'key_up'事件。该事件还提供了其他信息,例如键盘地址,按下的角色,按下它的玩家等。
在此示例中,按下后抬起空格键('key_down'事件)会破坏底部的循环,程序将终止。
我对lua编码比较陌生,我可以用相对简单的代码来解决问题,但是在这里我被卡住了。我有两个问题:
(1)当'eventHandlers.key_up'函数被定义为全局时,为什么它可以工作?
(2)metatable在此代码中的作用是什么?我一直在研究metatables和metamethods,但我发现它很难掌握。
我得到的错误是这样的:
Line 11: '(' expected near '.'
表eventHandlers
已经是本地范围,因此:
function eventHandlers.key_up(addr, char, code, playerName)
...正在向此本地表添加一个函数。你也可以这样做:
eventHandlers.key_up = function(addr, char, code, playerName)
......这可能会让这一点更加清晰。
Re metatables:这里setmetatable
返回一个空表,其中包含一个包含__index
元方法的元表。每当您尝试访问不在表中的字段时,都会调用__index
元方法。
所以这里如果你写eventHandlers.blah_blah()
,Lua将不会在表格中找到blah_blah
,所以如果它存在,将调用这个__index
元方法,它将用blah_blah
替换unknownEvent
并调用它,因为我们使用括号。