如何用局部变量作为参数在Lua中调用匿名函数?
- 内容介绍
- 文章标签
- 相关推荐
本文共计492个文字,预计阅读时间需要2分钟。
我有创建对象函数(在本例中是一个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)),但是在匿名函数内第二次为零,并且它抛出一个错误:尝试索引一个零值(本地’ N’).
这是有道理的,因为我从来没有真正传递它.有没有办法传递它?
hs.timer.doAfter调用的签名是:hs.timer.doAfter(sec,fn) – >计时器(www.hammerspoon.org/docs/hs.timer.html#doAfter)
您可以通过简单地从匿名函数中删除参数声明来修复它,但在函数中保留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
本文共计492个文字,预计阅读时间需要2分钟。
我有创建对象函数(在本例中是一个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)),但是在匿名函数内第二次为零,并且它抛出一个错误:尝试索引一个零值(本地’ N’).
这是有道理的,因为我从来没有真正传递它.有没有办法传递它?
hs.timer.doAfter调用的签名是:hs.timer.doAfter(sec,fn) – >计时器(www.hammerspoon.org/docs/hs.timer.html#doAfter)
您可以通过简单地从匿名函数中删除参数声明来修复它,但在函数中保留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

