局部变量仅在另一行声明时工作。

我有困难理解以下内容。我有以下代码:

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在一行上被定义,并在一行后被分配。为什么我不能在同一行上做到这一点?

点赞
用户869951
用户869951

在语句中

local a = expr

其中 expr 可以是任何 Lua 表达式,在表达式被计算之后,local 的 a 仅会被创建。在此之前,local a不存在。如果表达式使用名为 a 的变量,则该变量将从“上一级”中获取。参见 Lua 引用手册 2.6 节,它很短,但提供了更多的信息。但它的含义是,如果您有如下代码:

a = 123
local b = 456
local c = c + b

第三行将无法执行,因为“=”右边的 c 尚不存在,因此是 nil。虽然 b 是局部变量,但它确实存在。同样,在以下代码中:

local a = f()

如果 f() 使用 a,则 Lua 将查找位于该行上方的 a,因为它尚未创建 local a。如果上方没有 a,则无论该函数运行多少次,a 都将为 nil

do
    local a = 1
    function g() a=a+1 end -- 修改上面的局部变量 a(“上值”)

    local a = function() return a+1 end -- a+1 使用第一个局部变量 a
    -- 现在 a 是本地函数,使用第一个局部变量 a

    print(a()) -- 输出 2
    g() -- 增加外部 a
    print(a()) -- 输出 3
end

所以,定义在函数中的局部变量相对于使用它们的函数非常关键,直到 expr 被完全计算之前,这个局部变量(即使它是“隐藏”的先前的局部变量)都不存在。

2014-02-23 02:44:20