BeWithYou

胡搞的技术博客

  1. 首页
  2. C/C++/Lua
  3. 遇到Lua中闭包的一个问题

遇到Lua中闭包的一个问题


今天遇到一个坑,因为对lua中闭包的使用了解不够,记一下。

在skynet框架中,写一个延迟执行的方法,一般是 skynet.timeout(time * 100, fun)。如果fun函数需要入参的话,我一般是用匿名函数的方式传进去,如: skynet.timeout(time * 100, function()  fun(a) end)。

这时候问题就来了,当做参数被传到fun里面的a,在time秒过后fun最终执行的时候,到底值是多少呢?完整代码如下:

skynet.timeout(delay * 100,function() game.call_bet_host(next_uid,game.board_data.bet_token) end)

最终结果是,在delay秒过后,game.call_bet_host执行的时候,使用的入参game.board_data.bet_token,其实是最新的值,而不是之前写在timeout之中的值!

修改代码如下后,问题解决。

local token = game.board_data.bet_token
skynet.timeout(delay * 100,function() game.call_bet_host(next_uid,token) end)


为了使问题更清晰化。看下面这两段代码:

local a = 100
function get_fun()
    return function()
        echo(a)
    end
end
function echo(tmp)
    print(tmp)
end

local fun = get_fun()
fun() -- output 100
a = 200
fun() -- output 200
local a = 100
function get_fun()
    local tmp = a
    return function()
        echo(tmp)
    end
end
function echo(tmp)
    print(tmp)
end

local fun = get_fun()
fun() -- output 100
a = 200
fun() -- output 100

编程语言的一些高级特性,真正用起来如果不注意的话,会全都是坑的。目前对于lua,我还只是做流水账式的业务编程,还应该加深对其特性的理解才行。

回到顶部