zoukankan      html  css  js  c++  java
  • 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来。

  • 相关阅读:
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    Alpha 冲刺 (5/10)
    Alpha 冲刺 (4/10)
    福大软工 · BETA 版冲刺前准备(团队)
    福大软工 · 第十一次作业
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
  • 原文地址:https://www.cnblogs.com/weishuan/p/12318965.html
Copyright © 2011-2022 走看看