2

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

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是在一行中定义的,并且在一行之后被分配。为什么我不能在同一行执行此操作?

4

1 回答 1

4

在声明中

local a = expr

其中 expr 可以是任何 Lua 表达式,局部表达式a仅在表达式计算完成后创建。在此之前,local a不存在。如果表达式使用名为a的变量,则从下一个“级别”向上获取该变量。请参阅 Lua ref 的第 2.6 节,它很短,并提供了对此的更多见解。但这意味着如果你有

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

第三行将无法执行,因为c右侧的=尚不存在所以它是nilb确实存在,尽管它是本地的。同样,在

local a = f()

如果f()使用a,Lua 将寻找a该行之上的一个,因为它还没有创建一个local 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 之前,不存在本地(即使是“隐藏”先前本地的本地)。

于 2014-02-23T02:44:20.107 回答