加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua – 使用局部变量作为参数调用匿名函数

发布时间:2020-12-15 00:16:13 所属栏目:大数据 来源:网络整理
导读:我有一个创建对象的函数(在本例中是一个Hammerspoon Notify对象),我想将此对象作为参数传递给一个匿名函数,该函数本身就是一个函数调用的参数. 这是一个非常复杂的解释,但我认为一个例子非常清楚. function main() local n = hs.notify(...) print(n) -- `hs
我有一个创建对象的函数(在本例中是一个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) – >计时器(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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读