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

问题描述 投票:1回答:1

将'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,但我发现它很难掌握。

Open Computers - API:Event

我得到的错误是这样的:

Line 11: '(' expected near '.'
variables lua global local metatable
1个回答
0
投票

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并调用它,因为我们使用括号。

© www.soinside.com 2019 - 2024. All rights reserved.