ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

lua-函数

2021-02-18 10:34:57  阅读:173  来源: 互联网

标签:闭包 调用 end 函数 lua print fact


1. 函数是第一类值

  可以如下表示:

a={p=print};
a.p(1);

 在lua中所有的,所有的函数都是匿名的。当讨论函数名时,比如print,实际上指的是保存该函数的变量。

2.局部函数

 在定义局部递归函数时,由于原来的方法不适用,所以一点是极易出错的

local fact =function(n)
   if(n==0) then
	  return 1;
   else
	  return n*fact(n-1);--有问题
   end
end

 在lua语言编译函数体中的fact(n-1)调用时候,局部的fact尚未定义。因此,这个表达式会尝试调用全局的fact而非局部的fact。所以我们通过先定义局部变量,在定义函数的方法来解决这个问题

local fact;
fact =function(n)
   if(n==0) then
	  return 1;
   else
	  return n*fact(n-1);--有问题
   end
end

 当lua语言展开局部函数语法糖时候,使用的并不是之前的基本函数。

local function foo(params)  body end

 的定义会被展开成

loca foo;
foo= function (params)  body end

3 闭包

   通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数。

function test()
        local i=0
        return function()//尾调用
            i+=1
            return i
        end
    end
    c1=test()
    c2=test()//c1,c2是建立在同一个函数,同一个局部变量的不同实例上面的两个不同的闭包
            //闭包中的upvalue各自独立,调用一次test()就会产生一个新的闭包
    print(c1()) -->1
    print(c1()) -->2//重复调用时每一个调用都会记住上一次调用后的值,就是说i=1了已经
    print(c2())    -->1//闭包不同所以upvalue不同    
    print(c2()) -->2

4 闭包的应用

  闭包在迭代器中的运用:迭代器需要保留上一次调用的状态和下一次成功调用的状态,刚好可以使用闭包的机制来实现

  创建迭代器:(一定要注意迭代器只是一个生成器,他自己本身不带循环)

function list_iter(t)
            local i=0
            local n=table.getn(t)
            return function()
                i=i+1
                if i<=n then return t[i] end
            end
        end
    //这里的list_iter是一个工厂,每次调用都会产生一个新的闭包该闭包内部包括了upvalue(t,i,n)
    //因此每调用一次该函数产生的闭包那么该闭包就会根据记录上一次的状态,以及返回list的下一个

 迭代器的使用:

while中使用:
            t={10,20,90}
            iter=list_iter(t)//调用迭代器产生一个闭包
            while true do
                local element=iter()
                if element==nil then break end
                print(element)
                end
            end
        泛型for使用:
            t={10,0,29}
            for element in list_iter(t) do//这里的list_iter()工厂函数只会被调用一次产生一个闭包函数,后面的每一次迭代都是用该闭包函数,而不是工厂函数
                print(element)
            end

  

 

标签:闭包,调用,end,函数,lua,print,fact
来源: https://www.cnblogs.com/weiqiangwaideshijie/p/14410798.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有