为什么这个函数作为全局变量运行,但作为本地变量却不行?

定义 '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

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

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

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

我相对于 lua 编程还是较新手,可以处理相对简单的代码,但在这里却卡住了。我有两个问题:

(1) 为什么 'eventHandlers.key_up' 函数被定义为全局变量时可以使用,但被定义为本地变量时却无法使用?

(2) 元表在此代码中的作用是什么?我一直在研究元表和元方法,但发现它是一个相当困难的主题。

Open Computers - API:Event

我得到的错误是:

Line 11: '(' expected near '.'
点赞
用户1009432
用户1009432

eventHandlers 已经在本地范围内,因此:

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

...正在向此本地表添加函数。 你也可以这样做:

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

...这可能会更清晰一些。

关于元表:在这里,setmetatable 返回一个带有包含 __index 元方法的元表的空表。每当您尝试访问不在表中的字段时,都会调用 __index 元方法。

因此,如果您在这里写入 eventHandlers.blah_blah(),Lua 将在表中找不到 blah_blah,因此如果存在此 __index 元方法,将调用它,该元方法将用 unknownEvent 替换 blah_blah 并且调用它,因为我们使用了括号。

2019-04-12 22:08:44