[lua] 你所不知道的lua nil值在可变参数函数中怎么处理!
在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值在可变参数函数中怎么处理!的更多相关文章
- js值----你所不知道的JavaScript系列(6)
1.数组 在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串.数字.对象(object),甚至是其他数组(多维数组就是通过这种方式来实现的) .----<你所不知道的JavaS ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- 你所不知道的setTimeout
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...
- 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- Android中Context详解 ---- 你所不知道的Context
转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好, ...
- 你所不知道的 URL
0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...
随机推荐
- 在ASP.NET MVC3项目中,自定义404错误页面
在Web开发中,用户体验是至关重要的,一个友好的网站自然少不了自定义404错误页面. 让笔者为大家介绍404错误页面在ASP.NET MVC3项目中的配置: 第一步,在项目的Web.config文件中 ...
- Spring AOP中的动态代理
0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 Spring AOP中的动态代理机制 2.1 ...
- CSS3中字体平滑处理和抗锯齿渲染
在围观Drupal官方主题的时候,发现了一个有意思的非标准CSS选择器-webkit-font-smoothing,于是上手把玩了一番.如何使用css3字体平滑显示呢 要知道,W3C对CSS中字体的抗 ...
- 在ubuntu linux 中编写一个自己的bash脚本
在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pm为例(play music)),来实现音乐的播放.注:本人ununut中安装了audacious ...
- C语言函数名与函数指针详解
一.通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(in ...
- java_XML_比较【转】
JAVA解析XML的方式DOM.SAX.DOM4J.JDOM.StAX之详解与比较 1.各种方式的详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官 ...
- spring boot框架eclipse快速搭建
1.maven安装配置好,使用eclipse创建maven项目(选择maven-archetype-quickstart) 2.然后进入http://docs.spring.io/spring-boo ...
- UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天
这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...
- IOS之TableViewCell重用机制解决上下刷新重复显示
首先我是一个经验浅薄的iOS开发人员,这个问题想必许多初学者经常遇到这些问题,在面试中也会经常问到.现在我们一一解决. 首先我们要知道TableViewCell重用机制的原理是什么,我们抽象的理解为古 ...
- bzoj1492--斜率优化DP+cdq分治
显然在某一天要么花完所有钱,要么不花钱. 所以首先想到O(n^2)DP: f[i]=max{f[i-1],(f[j]*r[j]*a[i]+f[j]*b[i])/(a[j]*r[j]+b[j])},j& ...