• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua中的闭合函数、非全局函数与函数的尾调用详解

Lua中的闭合函数、非全局函数与函数的尾调用详解

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了Lua中函数的几个特别之处探究等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

上一篇我们简单地介绍了Lua的函数,这次,我们来点特别的,来介绍一下Lua的函数(小若:等等,我是不是错过了什么?)

1.闭合函数(closure)

理论上来说,Lua的所有函数都应该称之为闭合函数,但是,这种反人类的做法,我们还是抛弃吧~

按书上的描述,一个闭合函数就是:一个函数加上该函数所需访问的所有”非局部的变量“。

理论什么的,很烦人,来看看一个函数:
function count()
    local i = 0;
    return function()
              i = i + 1;
              return i;
           end
end
</div>

这个count函数会返回另外一个函数,重点是,这个返回的函数会使用count函数的局部变量。

先来运行,看看效果,使用如下方式调用:
    local func = count();
    print(func());
    print(func());
    print(func());
</div>

输出结果如下:
[LUA-print] 1
[LUA-print] 2
[LUA-print] 3
</div>
怎么旁白不出来咆哮一下?(小若:…咳咳…为毛线会这样?!不应该全部都输出1吗?!)
 
在这里,local i就属于一个非局部变量,因为它既不是全局变量,也不是单纯的局部变量(因为另外一个函数可以反问到它)。

再来回到定义,count函数里的那个函数,加上非局部变量i,就构成了一个闭合函数了,就这么简单。
 
对于闭合函数而已,属于它的非局部变量,并不是在调用它的时候临时产生的,而是和它一起存在的。

所以每次调用闭合函数,非局部变量的值都不会被重置。
 
如果大家还是不太清楚,那么,我们给这个闭合函数添加一个局部变量吧,修改count函数如下:
function count()
    return function()
              local i = 999;
              i = i + 1;
              return i;
           end
end
</div>

这次,把i作为这个内部函数的局部变量了,它不再是“非局部变量”。
仍然像这样调用:
    local func = count();
    print(func());
    print(func());
    print(func());
</div>

输出结果如下:
[LUA-print] 1000
[LUA-print] 1000
[LUA-print] 1000
</div>
陷入, 每一次i变量的值都是全新的。
闭合函数的用处可大着了,我们在开发过程中使用的频率应该还算比较大的~

2.非全局函数

又是这种看着就反人类的名词,非全局,那就是说,不是全局的函数(小若:废你个话啊!)

来看看这样的一个函数:
local function mutou()
  
end
</div>

这就是一个非全局函数,但,这么简单的东西我可不会拿出来说~
 
这里我想介绍一个“语法糖”,上面的mutou函数,其实相当于以下的代码:
local mutou;
mutou = function ()
  
end
</div>

这就是我们函数的真实面貌,函数名称其实也是一个变量名而已。
所以,有时候,我们在定义函数的时候,要注意一下顺序。比如,这样的两个函数:
local function mutou()
    print("mutou");
    return pangbai();
end
local function pangbai()
    print("pangbai");
end
</div>

mutou函数里要调用pangbai函数。
在编译的时候,mutou函数是编译不过的,因为这个时候pangbai函数未定义,换句话说,pangbai变量并不存在。
只要换一个方式就可以解决这个问题了:
local mutou;
local pangbai;
mutou = function ()
    print("mutou");
    return pangbai();
end
pangbai = function ()
    print("pangbai");
end
</div>

这样编译就没问题了,好吧,也许Lua里不该叫编译,反正,不会报语法错误了~

3.尾调用

好了,一个名词比一个名词要反人类。

尾调用的大致意思是:一个函数的调用是另一个函数的最后一个动作时,这个调用就称之为尾调用。

比如这样的函数:
function mutou()
    return count();
end
</div>

当mutou函数调用完count函数之后,就没有其他事情要做了,所以,调用count函数,就属于尾调用。
但,如果是这样的函数:
function mutou()
    return count() + 1;
end
</div>

这就不属于尾调用,因为调用完count函数之后,还要取得count的返回值,然后进行一次加法操作,这就不符合定义了。
 
尾调用有什么意义呢?
进行尾调用时不会耗费多余的栈空间,比如这样一个经典的函数:
function f

您可能想查找下面的文章:

相关文章

  • Lua调用自定义C模块
  • Lua中的持久化和序列化详解
  • Lua中的变量类型与语句学习总结
  • Lua学习笔记之数据类型
  • C++中调用Lua配置文件和响应函数示例
  • Lua入门学习笔记
  • 让你的python代码更加pythonic(简练、明确、优雅)
  • lua脚本语言快速入门教程
  • Lua与C语言间的交互实例
  • Lua简介、编译安装教程及变量等语法介绍

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua利用cjson读写json示例分享
    • Lua中ipair和pair的区别
    • 使用Lua来扩展C++程序的方法
    • Lua中的metatable介绍
    • Lua极简入门指南(三): loadfile和错误处理
    • Lua中的函数知识总结
    • Lua中的逻辑运算符使用详解
    • 在Lua程序中使用MySQL的教程
    • Lua获取文件长度和判断文件是否存在函数分享
    • lua获取未来某时间点的时间戳解决方案

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有