Почему эта функция работает как глобальная переменная, а не как локальная? - PullRequest
1 голос
/ 12 апреля 2019

Определение '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 для Minecraft.«Событие» - это, по сути, библиотека, которая извлекает сигналы с компьютера (в данном случае с клавиатуры) и сообщает компьютеру, что делать с событием.

Программа в основном ожидает в цикле внизу, слушаядля события.В этом примере прослушивается событие «key_up».Событие также дает дополнительную информацию, такую ​​как адрес клавиатуры, нажатый символ, игрок, который его нажал и т. Д.

В этом примере поднятие пробела после нажатия (событие «key_down») прерывает циклвнизу, и программа завершается.

Я относительно новичок в кодировании lua, и я могу обходить относительно простой код, однако здесь я застрял.У меня есть два вопроса:

(1) Почему это работает, когда функция 'eventHandlers.key_up' определяется как глобальная, а не как локальная?

(2) Чтороль метатаблицы в этом коде?Я изучал метатаблицы и метаметоды, но мне трудно понять эту тему.

Открытые компьютеры - API: Событие

Я получаю ошибкуэто:

Line 11: '(' expected near '.'

1 Ответ

0 голосов
/ 13 апреля 2019

Таблица 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 и назовите его, потому что мы использовали круглые скобки.

...