Mik*_*yla 5 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
Run Code Online (Sandbox Code Playgroud)
这个输出是n第一次打印(hs.notify: Title (0x7fbd2b5318f8)),但是nil第二次,在匿名函数内,它会抛出一个错误:attempt to index a nil value (local 'n').
这是有道理的,因为我从来没有真正传递它.有没有办法传递它?电话的签名hs.timer.doAfter是:hs.timer.doAfter(sec, fn) -> timer(http://www.hammerspoon.org/docs/hs.timer.html#doAfter)
匿名函数的定义包括声明一个名为的参数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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
931 次 |
| 最近记录: |