使用局部变量作为参数

时间:2016-07-16 02:37:12

标签: lua callback hammerspoon

我有一个创建对象的函数(在本例中是一个Hammerspoon Notify对象),我希望将此对象作为参数传递给一个匿名函数,该函数本身就是一个函数调用的参数。

这是一个非常复杂的解释,但我认为一个例子非常清楚。

function main()
    local n = hs.notify(...)
    print(n)          -- `hs.notify: Title (0x7fbd2b5318f8)`
    hs.timer.doAfter(1, function(n)
        print(n)      -- nil
        n:withdraw()  -- error: attempt to index a nil value (local 'n')
    end)
end

这个输出是n第一次打印正常(hs.notify: Title (0x7fbd2b5318f8)),但在匿名函数内第二次打印nil,它会抛出错误:{ {1}}。

这是有道理的,因为我从来没有真正传递它。有没有办法传递它? attempt to index a nil value (local 'n')来电的签名为:hs.timer.doAfterhttp://www.hammerspoon.org/docs/hs.timer.html#doAfter

1 个答案:

答案 0 :(得分:9)

匿名函数的定义包括声明名为n的参数,该参数隐藏了外部作用域中的n变量。函数声明创建一个新的局部变量nil,除非参数实际传递给函数,但是调用你的匿名函数的计时器函数不希望传递任何东西,所以函数本地n保持零。

您可以通过简单地从匿名函数中删除参数声明来修复它,但在函数中保留n的用法。然后它将从外部范围捕获n变量,该变量具有从hs.notify(...)返回的值。

function main()
    local n = hs.notify(...)
    print(n)          -- `hs.notify: Title (0x7fbd2b5318f8)`
    hs.timer.doAfter(1, function() -- <== no argument
        print(n)      -- nil
        n:withdraw()  -- error: attempt to index a nil value (local 'n')
    end)
end