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

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 

时间: 2024-11-01 23:57:26

Lua学习笔记之函数、变长参数、closure(闭包)、select等_Lua的相关文章

Javascript学习笔记之 函数篇(三) : 闭包和引用_基础知识

Javascript 中一个最重要的特性就是闭包的使用.因为闭包的使用,当前作用域总可以访问外部的作用域.因为 Javascript 没有块级作用域,只有函数作用域,所以闭包的使用与函数是紧密相关的. 模拟私有变量 复制代码 代码如下: function Counter(start) {     var count = start;     return {         increment: function() {             count++;         },      

Lua学习笔记之类型与值_Lua

基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8种基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: local iValue = 10

C++中的变长参数深入理解_C 语言

前言 在吸进的一个项目中为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的类都有默认构造函数,以及复制构造函数等.但使用共享内存和内存池的类可能没有默认构造函数,而是定义了多个参数的构造函数,于是如何将参数传入MemNew函数便成了问题. 一.变长参数函数 首先回顾一下较多使用的变长参数函数,最经典的便是printf. extern int printf(cons

J2SE5.0 实例---变长参数

j2se 变长参数(Varargs)与泛型一样,变长参数是C++中有而Java中没有的一种语言特性,在过去如果我们想向一个函数传递可变数量的函数,就必须首先将这些参数放入一个数组中,然后将数组传递给函数.就如同下面所作的一样: Object[] arguments = { 640, "kb", "anybody", "Bill Gates" }; String result = MessageFormat.format(      "{

Spark UDF变长参数的二三事儿

在复杂业务逻辑中,我们经常会用到Spark的UDF,当一个UDF需要传入多列的内容并进行处理时,UDF的传参该怎么做呢? 下面通过变长参数引出,逐一介绍三种可行方法以及一些不可行的尝试... 引子 变长参数对于我们来说并不陌生,在Java里我们这么写 public void varArgs(String... args)  在Scala里我们这么写 def varArgs(cols: String*): String  而在Spark里,很多时候我们有自己的业务逻辑,现成的functions满足

java-基础-变长参数

在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用. 可变长参数的定义 print(String... args){ ... } print(); print("hello"); print("hello","lisi"); print("hello","张三", "alexia") 在调用方法的时候,如果

ruby学习笔记(11)--symbol与hash参数

symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750320887303208871032088690 可以

Javascript学习笔记之函数篇(四):arguments 对象_基础知识

每一个 Javascript 函数都能在自己作用域内访问一个特殊的变量 - arguments.这个变量含有一个传递给函数的所有参数的列表. arguments 对象不是一个数组.尽管在语法上它跟数组有相同的地方,例如它拥有 length 属性.但它并不是从 Array.prototype 继承而来,实际上,它就是一个对象. 因此,我们不能直接对 arguments 使用一些数组的方法,例如 push, pop 或 slice 等. 所以为了使用这些方法,我们就需要将其转换为一个真正的数组. 转

Lua学习笔记之表和函数_Lua

Lua中的表和函数比较重要,正是因为二者的结合才完成了很多很多的功能,Lua才变得如此的强大,所以有必要仔细的学习一下表和函数.如下的代码体现了表的用法. --表 --可以使用构造器来初始化表,表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表. local days = {"xiao", "ta", "hello", "lua"} --第一个元素索引为1,以后的类推,这一点和其他语言的第一个元素索引是0