lua回调时把函数当参数传递时需注意的事项

world.timer的函数定义:

function world.timer(tick, func)
    -- do something
end

首先说明一下:tick是时间单位, 例如20。 func则是函数名。

这个函数的作用是延迟20个tick之后调用func函数。

func的函数定义:

function func 
    -- do another thing
end 

world.timer的调用:

world.timer(20, func)

然后会在20个tick后调用 func函数。

====================================

遇到的问题如下:

定义了一个func函数:

function Entity:CheckHandItem()
    -- check item ....
end

在调用的时候,写成了如下方式:

world.timer(20, Entity:CheckHandItem())

结果并没有延迟20个tick调用,而是立刻执行了。

问题就在于world.timer的参数传递。因为把Entity:CheckHandItem()当成参数传递给了world.timer。

正确的调用方式应该如下:

world.timer(20, Entity.CheckHandItem, self))  -- 是否传递self则看具体的实现方式

注意:  Entity.CheckHandItem  这里使用的是 "点" 方法 。

实际上就是以下两个函数调用的差别:

world.timer(time, func)     -- 方法 1

world.timer(time, func())   -- 方法 2

方法1   把func 当参数传递给 world.timer, 然后20个tick后执行func。

方法2   先调用了func(), 然后再把func()的返回值传递给了world.timer。

假设func()返回值是nil ,那么整个调用过程是: 立刻执行func()得到返回值nil,然后再调用 world.timer(20, nil)。然后20个tick后,延迟执行nil,但是nil并不是函数,所以没有意义,什么事都没发生。

回到CheckHandItem的调用:

world.timer(20, Entity.CheckHandItem)      -- 方法1, 把函数当参数传递, 延迟20个tick后执行CheckHandItem

world.timer(20, Entity:CheckHandItem()) -- 方法2, 立刻执行CheckHandItem, 然后延迟20个tick后什么事都没做

平时不注意 "点”方法 和 "冒号" 方法的话,就会写出bug来。

猜你喜欢

转载自www.cnblogs.com/weishuan/p/12318965.html
今日推荐