热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lua基本知识点3

1.尾调用尾调用简单来说就是当一个函数执行完之后,没有其他事干了,调用另外一个函数,这就是尾调用,如下代码localeat

1.尾调用

尾调用简单来说就是当一个函数执行完之后,没有其他事干了,调用另外一个函数,这就是尾调用,如下代码

local eat;
local drink;
eat = function(food) 非全局函数print( "eat food" )return drink();
enddrink = function (milk) 全局函数print( "drink milk" )return "drink milk" ;
endeat();


原理:

lua支持尾调用消除(tail-call elimination)这一特性。

尾调用:当一个函数是另一个函数的最后一个动作时,该调用就是一条尾调用。

尾调用消除:当在进行尾调用时不消耗任何栈空间,这种实现就称为尾调用消除。

function f(x) return g(x) end

当程序执行完g(x)之后,程序就不需要回到f()这个函数了,因为已经无事情可做了,这时程序也不需要保存任何关于f()函数的栈信息了。当g返回,程序的控制权直接返回到调用f的那个点上。


正是这个尾调用消除特性,使得一个程序可以拥有无数嵌套的尾调用,而不会造成栈溢出,例如:

function foo(n)
if n>0 thenreturn foo(n-1) end
end


一直可以调用

不是正确的尾调用如下例子:

function f()a(x)return t(x)+1
end


这个f()函数没有执行完,还有一个+1的动作,所以不能算是尾调用



2.闭包




所谓闭包就是一个局部的变量被另外一个函数用到,生命周期延长,这就是闭包。如下例子:


local sleep;
local wakeUp;
sleep = function ( ... )print( "sleep")local time = 3; --[[函数闭包--]]return function(timer)time =time + 1;return "我睡了" .. time .."小时";end
end
local r = sleep();


上面的案例就形成了闭包,time是局部变量,本来该函数执行完之后,就销毁,但它没有, time被另外一个函数用到,它的生命周期延长,它已经属于一个非局部变量,但又不是全局变量。这样就是一个闭包的显著特点。

如果还是不懂的话,可以看 http://www.2cto.com/kf/201503/382691.html这个网址,上边说的很详细


再加深一点难度

function zsg( ... )local i = 20return function ( ... )i=i+1return iend
endlocal fun = zsg()
print(fun())
print(fun())
print(fun())
输出结果为:21,22,23

对于闭合函数,属于它的非局部变量,并不是在调用它临时产生的,而是和它一起存在的,所以每次调用闭合函数,非局部变量的值不会被重置

扩展

当一个函数调用另外一个局部的函数时,这个局部函数必须在调用那个函数之前声明,否则会出错,例如下边代码

错误的代码

local eat;
eat = function() print( "eat food" )return drink();
end
local drink=function ( ... )print("drink")
end
eat()


正确的代码

local eat
local drink
eat = function() print( "eat food" )return drink()
end
drink=function ( ... )print("drink")
end
eat()


或者可以定义成全局的





博主链接:
http://blog.csdn.net/qq131530624/article/details/53557294




推荐阅读
  • 最近遇到了一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。希望各位大神能够提供帮助。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • 本文介绍了如何查看PHP网站及其源码的方法,包括环境搭建、本地测试、源码查看和在线查找等步骤。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 本文介绍了如何在Python中使用插值方法将不同分辨率的数据统一到相同的分辨率。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
author-avatar
手机用户2502920645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有