在lua中,

  问题1:如果你在可变参数...中传入若干个参数,其中有的参数要带nil,这时怎么解决呢?比如local function _test(...) end    _test(1, nil, 3))

  问题2:更甚于在一个带可变参数的函数里返回值是一个带可变参数的尾调用,这时还能正确得到要的参数?(比如 local function _test2(...) return function(...) end end  _test2(4, nil, 6))


接下来几行大致过下基础知识:

lua中nil是代表无(这不是废话吗?别急,往下看):

--比如:

a = nil
print(a)
--这时输出的a是nil

--再比如:
, , }
for k, v in pairs(a) do
   print(k, '=', tostring(v))
end
--这时输出的是
    =
    =
    =
--也就是跳过了第二个为nil的键值对

先来解决问题1,看这个例子:

local function _test(...)
    local paramCount = select('#', ...)
    local printStr = ''
    , paramCount do
        local v = select(i, ...)
        printStr = printStr..i..'='..tostring(v)..', '
    end
    print(printStr)
end
, , )
--输出为: 1=1, 2=nil, 3=2, 4=3

上面可以看到正确地拿到了nil参数,它确实是在第2位的;主要就是利用select函数取到可变参数的总个数,如果你是要在_test(...)函数中将可变参数保存下来,然后在适当的时机再传到其他的函数中,则需要按下面这种方式:

local paramT
local function _test(...)
    paramT = {paramCount=select('#', ...), ...}
end
local function _receiveArg(...)
    local paramCount = select('#', ...)
    local printStr = ''
    , paramCount do
        local v = select(i, ...)
        printStr = printStr..i..'='..tostring(v)..', '
    end
    print(printStr)
end
, , )
, paramT.paramCount))
--同样地输出: 1=1, 2=nil, 3=2, 4=3, 

主要就是使用unpack函数,把参数表paramT解包作为参数传过去,但要注意指定参数对应的索引范围是1~paramT.paramCount,特别的paramT.paramCount这个是存放在table中的hash部分,所以不受影响;


最后解决问题2,看这个例子:

local function _receiveArg(...)
    local paramCount = select('#', ...)
    local printStr = ''
    , paramCount do
        local v = select(i, ...)
        printStr = printStr..i..'='..tostring(v)..', '
    end
    print(printStr)
end
(func, ...)
    local paramT = {...}
    local paramCount = select('#', ...)
    return function(...)
        local callbackParamCount = select('#', ...)
        , callbackParamCount do
            paramT[paramCount + i] = select(i, ...)
        end
        , paramCount + callbackParamCount))
    end
end
(, )
func(, )
--输出:1=10, 2=nil, 3=30, 4=nil, 5=40, 6=nil, 7=50, 

主要看_test2(func, ...)这个函数里中的function(...)尾调用的处理!里面是合并了_test2函数的可变参数列表与这个尾调用的可变参数列表!并最后顺序把参数原封不动地return。


大致就这些,题外话:现在在我们的游戏里使用lua就上面这样的写法,原先想用coroutine替换掉这些回调(尾调用),因为之前就是碰到可变参数里带nil值的情况无法正确的处理!(用谷歌搜索了一些博文,但都没提到我想要的解决方案)最后还是在stackoverflow(见这个网址:http://stackoverflow.com/questions/7183998/in-lua-what-is-the-right-way-to-handle-varargs-which-contains-nil)看了unpack的正确用法,归根结底还是没先去看官方文档中select与unpack函数的正确用法导致!!所以上述的是实现方式是我花了一点时间相通后实现的!

[lua] 你所不知道的lua nil值在可变参数函数中怎么处理!的更多相关文章

  1. js值----你所不知道的JavaScript系列(6)

    1.数组 在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串.数字.对象(object),甚至是其他数组(多维数组就是通过这种方式来实现的) .----<你所不知道的JavaS ...

  2. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  3. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  4. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  5. 你所不知道的linq(二)

    上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...

  6. 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  7. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...

  8. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  9. 你所不知道的 URL

    0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...

随机推荐

  1. 进阶之初探nodeJS

    一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知 ...

  2. 雷锋推到雷峰塔,Java implements Javascript。

    最近遇到这么一个问题,如何让用户在软件中自定义函数. 举个例子,使用Java做一个小的监控系统,用户A希望CPU超过90%的时候报警,B用户希望内存超过90%的时候报警,C用户希望CPU超过90%或者 ...

  3. Python之日期与时间处理模块(date和datetime)

    本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常需要用到日期与时间,如: 作为日志信息的内容输出 计算某个功能的执行时 ...

  4. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  5. Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be

    有些操作只能回到主线程操作 比如: mbprogresshud只能在主线程中使用 而且注意凡是关于布局的代码也只能下载主线程

  6. Windows下搭建HTTP/HTTPS服务器及测试过程

    1 安装Apache http://www.apachehaus.com/cgi-bin/download.plx 选择合适的版本下载 本次下载的是 Apache 2.4.x VC14 Apache版 ...

  7. Javascript前端面试题

    在网上看到了一些Javascript的面试题就整理了下来,后续看到再继续补充. 面试题按类型来分,主要涉及到"技术"与"非技术"两大类,技术类别下涉及到的子类别 ...

  8. 手动搭建apache james邮件服务器,实现邮件功能

    最近一直在搞邮件这块,本来我们邮件发送是用的腾讯免费的企业邮箱,邮件功能没有问题,但是由于邮件的限制,如下: 这些限制导致我们的部分客户是收不到邮件的,哪怕付费,这样的固定频率限制也是无法解决的,可以 ...

  9. 复杂的1秒--图解Google搜索技术

    谷歌(Google),一个非常成功,但又十分神秘,而且带有几分理想化色彩的互联网搜索巨人,它还是一家相当了不起的广告公司,谷歌首页上的那个搜索按钮是其年赢利200亿美元的杀手级应用,也是Interne ...

  10. Java编程风格学习(二)

    二.格式规范 在上一篇的Java编程风格学习(一)中我们讲述了在Java编码中的一般原则,虽然这些原则并不涉及具体的代码规范,但是这些原则却是我们在Java开发过程中所应该遵循的规范与思想.今天我们将 ...