为什么这个函数 运行 是全局变量,而不是局部变量?
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) 元表在这段代码中的作用是什么?我一直在研究元表和元方法,但我发现它很难掌握。
我得到的错误是这样的:
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
并调用它,因为我们使用了括号。
将 '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) 元表在这段代码中的作用是什么?我一直在研究元表和元方法,但我发现它很难掌握。
我得到的错误是这样的:
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
并调用它,因为我们使用了括号。