我无法理解以下内容。我有以下代码:
awful.key({ "Mod1" }, "Tab",
function (c)
local grabber = awful.keygrabber.run(
function(mod, key, event)
if grabber == nil then
naughty.notify({ text="nope"})
end
awful.keygrabber.stop(grabber)
return
end)
end)
当我按 super+Tab 时,这应该捕获键盘,然后通过调用 stop 方法释放键盘焦点。然而,grabber
变量似乎为nil
。起初我认为这是一个范围问题,所以我删除了 local
,这有效。但我感觉这似乎不是解决这个问题的方法。
经过一番尝试后,我发现这是可行的:
awful.key({ "Mod1" }, "Tab",
function (c)
local grabber
grabber = awful.keygrabber.run(
function(mod, key, event)
if grabber == nil then
naughty.notify({ text="nope"})
end
awful.keygrabber.stop(grabber)
return
end)
end)
唯一的区别是变量 grabber
在一行上定义,并在一行后赋值。为什么我不能在同一行上执行此操作?
最佳答案
在声明中
local a = expr
其中 expr 可以是任何 Lua 表达式,本地 a
仅在表达式求值后创建。在此之前,本地a
并不存在。如果表达式使用名为 a
的变量,则该变量将从下一个“级别”向上获取。请参阅 Lua 引用文献的第 2.6 节,它很短并且提供了对此的更多见解。但这意味着如果你有
a = 123
local b = 456
local c = c + b
第三行将无法执行,因为=
右侧的c
还不存在,因此为nil
。 b
确实存在,尽管它是本地的。同样,在
local a = f()
如果f()
使用a
,Lua将寻找该行上方的a
,因为它还没有创建本地a
。如果上面没有,a
将为 nil
,无论函数运行多少次:
do
local a = 1
function g() a=a+1 end -- modifies the above local a ("upvalue")
local a = function() return a+1 end -- a+1 uses the first local a
-- a is now a local function, using the first local a
print(a()) -- prints 2
g() -- increases the external a
print(a()) -- prints 3
end
因此,相对于使用它们的函数声明局部变量的位置至关重要,并且在完全评估 expr 之前,局部变量不存在(即使是“隐藏”先前局部变量的局部变量)。
关于lua - 局部变量仅在另一行声明时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21959675/