lua - 局部变量仅在另一行声明时才有效

标签 lua awesome-wm

我无法理解以下内容。我有以下代码:

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还不存在,因此为nilb 确实存在,尽管它是本地的。同样,在

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/

相关文章:

用于嵌入式系统的 LuaJIT 或 eLua?

lua - 如何找到我使用哪个版本的 Lua?

c++ - 当我两次调用绑定(bind)的 C++ 类函数时出现 lua 错误?

lua - 未平铺时如何从窗口动态隐藏边框(Awesome WM)?

menu - 在 Awesome WM 中,是否可以根据您所在的标签有不同的菜单?

youtube - 如何限制Youtube Player全屏仍在窗口内,我不想拥有真正的全屏

c++ - SOL2/C++ - Lua 初学者,是否可以在 Lua 文件之间传递 Lua 表?

encryption - OpenResty lua-resty-string : Unable to decrypt cipher encrypted by Crypto-JS (AES default)

awesome-wm - 很棒的 WM : what do the icons of the title bar mean?

lua - 如何在 Awesome WM 中聚焦客户