使用局部变量作为参数调用匿名函数
Call an anonymous function with a local variable as parameter
我有一个创建对象(在本例中为 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
,在匿名函数内部,它会抛出错误: 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
我有一个创建对象(在本例中为 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
,在匿名函数内部,它会抛出错误: 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