2014-02-22 44 views
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) 

这应该抓住键盘当我按超级 + 标签然后通过调用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

局部变量的范围从**声明后的第一个语句**开始,一直持续到包含该声明的最内层块的最后一个非void语句。 [手册](http://www.lua.org/manual/5.2/manual.html#3.5) –

+0

有趣的是,本地抓取者抓取器= awful.keygrabber.run('...,因为空格,注释和';'是语句分隔符(但是,这会让阅读变得更加困难) –

回答

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。如果没有以上,anil,无论函数是如何运行的次数:

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被充分评估为止。

+2

即使没有do-end块,第一个'a'仍然存在,改变'g'打印'a'会显示出来。 – lhf

+0

感谢您指点我已经改变了我的答案的结尾,以反映这一点,希望它更好 – Schollii

+0

你解释了这个问题相当好,但我希望这个例子来证明这个问题,这个例子似乎工作而不是解决问题。 – siebz0r

相关问题