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来。

 

posted @ 2020-02-16 21:54  HaHahahahaaaa  阅读(843)  评论(0编辑  收藏  举报