Lua学习笔记之函数、变长参数、closure(闭包)、select等

   2015-08-18 0
核心提示:这篇文章主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下

1. Lua函数支持多返回值,但并不是每次调用函数返回的全部值都会被使用。

有一条规则是只有当函数调用是表达式最后一个元素时,才会使用它的全部返回值。看代码:

复制代码 代码如下:

--string.find函数返回两个值,:被查找子串的开始索引和结束索引 
s,e = string.find("Lua program language","Lua") 
print(s,e)  --> 1    3 
 
--如果找不到,则输出nil和nil 
s,e = string.find("Lua program language","Lub") 
print(s,e)  -->nil   nil 
 
 
--找出数组中最大的元素和其索引 
function maximum(a) 
    local mi = 1   --最大元素索引,开始假设第一个元素就是最大元素 
    local m = a[mi] 
    for i,val in ipairs(a) do 
        if m < val then 
            mi,m = i,val 
        end 
    end 
    return mi,m 
end 
 
print(maximum{1,2,10,4,5,7}) --> 3   10 
 
--返回多个值的函数只有作为表达式最有一个元素时才能使用它返回的多个值 
--否则只取第一个值 
 
 
--定义一个返回两个值的函数 
function foo() return "a","b" end 
 
--foo()在表达式最后,使用了他返回的两个值 
a,b = foo()  -->a    b 
print(a,b) 
 
--foo()出现在表达式中间, 只使用了她返回的第一个值 
a,b,c = foo(),"c" 
print(a,b,c)   -->a  c   nil 
 
--使用了函数返回的两个结果 
print(foo())  -->a   b 
 
--把函数调用放在括号中间, 迫使函数只返回的一个结果 
print((foo()))  --> a 

2. 函数支持变长参数:...
如果变长参数中没有nil,那么可以使用ipairs(...)来遍历得到所有的参数.

如果参数中有nil,那么就只能使用select()函数了. 因为ipairs只能遍历到nil处.

复制代码 代码如下:

--变长参数 
 
 
--使用变长参数完成对nunmber列表求和 
function add(...) 
    local sum = 0 
    for i,v in ipairs(...) do 
        sum = sum + v 
    end 
    return sum 
end 
 
print(add{1.1,2.2,3.3,4.4,nil,6,8}) -->11   说明nil后面的6,8都没有遍历到 
 
 
--如果变长参数中故意传入nil 
--那么就要使用select函数来访问变长参数列表了. 
--select得以参数如果传入的是整数n, 返回的是第i个元素开始到最后一个元素结束的列表 
--如果传入的是"#",则返回参数列表的总长度 
 
function add2(...) 
    local sum = 0 
    local arg 
    for i=1,select('#',...) do 
 
        --从输出结果可见,select(i,...)  返回的是第i个元素开始到最后一个元素结束的列表 
        print(select(i,...))    -->2 4   6   nil 5   8 
                                -->4 6   nil 5   8 
                                -->6 nil 5   8 
                                -->nil   5   8 
                                -->5 8 
                                -->8 
 
        --只取列表的第一个值 
        arg = select(i,...) 
        if arg then 
            sum = sum + arg 
        end 
 
    end 
    return sum 
end 
print(add2(2,4,6,nil,5,8)) -->25   说明nil后边的值都遍历到了 

3.closure(闭包)

我的理解是:使得内部函数能够调用外部函数的局部变量,而且在外部函数调用结束后仍然能使用外部函数的局部变量.而每次调用外部函数的会重新创建一个closure,而且以前的不会消失.这里不禁产生一个疑问:closure在什么时候释放

复制代码 代码如下:

-- closure的特性 
 
function newCounter() 
    local i = 0 
    return function() 
        i = i + 1 
        return i 
    end 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • LUA解析json小demo
    需要修改的json数据gui-config.json{"configs": [{"server": "JP3.ISS.TF","server_port": 443,"password": "58603228","method": "aes-256-cfb","remarks": ""},{"serv
    03-16
  • 第二十三篇:在SOUI中使用LUA脚本开发界面
    像写网页一样做客户端界面可能是很多客户端开发的理想。做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑。当需求变化时,只需要在服务端把相关代码调整一下,用户即可看到新的
    03-16
  • windows下编译lua源码"><转>windows下编译lua源
    因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 lua for windows 还没有lua5.2,我又想用这个版本的lua,所以被逼无奈只能自己编一下lua源码。首先从 lua的官网 下载你想要使用的lua源码,比如我下载的就是lua5.2。解压后内容如下:
    03-16
  • lua:使用Lua处理游戏数据
    在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件。其实lua在游戏开发中可以作为一个强大的保存、载入游戏数据的工具。 比如说,现在我有一份表单:data.xls用什么工具解析这个Excel文件并将数据载入游戏?我们可以使用Lua来完成这个工作。不过要
    03-16
  • 第1课 - 学习 Lua 的意义
    第1课 - 学习 Lua 的意义
    第1课 - 学习 Lua 的意义1.Lua 简介           (1) 1993年、巴西(2) 小巧精致的脚本语言,大小只有 200K(3) 用标准C语言写成,能够在所有的平台上编译运行(4) 发明的目标是嵌入在C/C++中,为应用程序提供灵活的扩展和定制功能(5) 不适合用于开发
    03-16
  • RedisTemplate 常用API+事务+陷阱+序列化+pipeline+LUA
    RedisTemplate 常用API+事务+陷阱+序列化+pipel
    https://www.jianshu.com/p/7bf5dc61ca06/https://blog.csdn.net/qq_34021712/article/details/79606551https://www.jianshu.com/p/c9f5718e58f0dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/depe
    03-08
  • Nginx动态路由的新姿势:使用Go取代lua nginx路由规则
    Nginx动态路由的新姿势:使用Go取代lua nginx路
    导语: 在Nitro 中, 我们需要一款专业的负载均衡器。 经过一番研究之后,Mihai Todor和我使用Go构建了基于Nginx、Redis 协议的路由器解决方案,其中nginx负责所有繁重工作,路由器本身并不承载流量。 这个解决方案过去一年在生产环境中运行顺畅。 以下是我
    03-08
  • cocos2d-lua 控制台输入Lua指令方便调试
    用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试。1 首先在行首加入lua的引用,如下1 #include "main.h"2 #include "AppDelegate.h"3 #include "cocos2d.h"4 #i
    02-09
  • lua_touserdata
    void *lua_touserdata(lua_State*L,intindex);如果给定索引处的值是一个完整的userdata,函数返回内存块的地址。如果值是一个lightuserdata,那么就返回它表示的指针。否则,返回NULL。例如: 在CCLuaStack::executeFunction()函数中有一段代码是用来获取c++
    02-09
  • Lua 5.2 中文参考手册
    闲来无事,发现Lua更新到了5.2.2,参考手册也更到了5.2,在网上发现只有云风翻译的5.1版,花了几天时间翻译了一些。参考手册有点长,又要随时修改,所以在github上建了项目,有需要的朋友可以看看,同时也欢迎指正。中文手册:Lua 5.2中文参考手册
    02-09
点击排行