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

  • 相关阅读:
    前端性能优化(css动画篇)
    常用的布局及技巧
    一些有用的技能点
    做webApp遇到的一些坑及解决方案
    mysql5.7.30 编译安装
    windows使用Pandoc将Markdown转换为PDF文件
    源码编译安装keepalived
    源码编译php
    源码编译nginx
    源码编译PHP提示zip错误
  • 原文地址:https://www.cnblogs.com/weishuan/p/12318965.html
Copyright © 2020-2023  润新知