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