Lua 闭包快速入门

转载 2013年12月02日 22:00:23

示例代码

local function x()
    local a = 1

    local function y()
        print(a)
    end
    if 1 > 0 then
        local function z()
        end
    end
    a = 2
    y()
    -- z() -- will fail, function not found
end

x()

讲解

闭包(closure)是一个在高级语言中比较通用的概念,理解闭包之后写代码可以事(tí)半(shēng)功(bī)倍(gé)。我学习闭包这个概念时,看到的都是生涩、难懂、冗长的例子,在经过自己的实践领悟之后,我写了上面这一小段示例代码,用来讲解闭包。相信有任何一门语言基础的人都能轻松看懂这十多行代码。这就是为什么我要重新造这个轮子。
简单来说:

函数 = 抽象
闭包 = 抽象 + upvalue + env

所以,闭包与传统的『函数』概念基本相似,只是比函数多两个特性:upvalue和env。

upvalue
看上面的例子,变量a就是一个upvalue。在函数y()中打印了变量a,而实际上函数y()并没有定义任何传入参数。y()能够引用到函数外面的变量a,这样的变量就叫upvalue。所以闭包的好处是,你不必声明一堆传入参数,就可以在函数内直接读写upvalue。
env
例子中定义了3个函数x() y() z(),其中y()和z()是在x()的内部定义的,这就是闭包的灵活性,可以简单理解成:函数可以嵌套函数,一层包着一层。在传统的编程语言中,即使是子函数,也是必须要在外面定义的。env指的是环境,也就是变量和函数的作用范围/生存期。理解了env,就真正理解了闭包,才明白哪些变量是可以当做upvalue引用的,哪些内部函数是可以调用的。
函数y()的作用范围是,从y()的定义开始,一直到包着它的函数x()定义结束,都是y()的作用范围,在这期间都可以调用到y(),所以代码中y()的调用是可以正常执行的。函数z()的作用范围是,从z()的定义开始,一直到包着它的if .. end语句就结束了,所以代码中注释起来的z()调用,实际执行起来,会报错找不到这个函数。
变量a的作用范围从变量a的定义开始,一直到包着它的函数x()定义结束,所以x()内的每一个地方都可以引用到a,包括y()和z()的里面。

执行结果

这段代码是可以执行的,执行的结果,也就是a的值打出来是1还是2?
这里的执行顺序是:首先a被赋值为1;然后定义了函数y(),这时候y()是不会执行的,因为并没有调用;然后a被赋值为2;然后调用了函数y(),这时候y()被执行,输出当前a的值,结果是2。

Lua只有闭包

实际上,Lua所有的函数都是闭包,也就是说,Lua只有闭包,而没有传统意义的函数,所以在所有Lua代码中,你都可以自由地使用这个特性,轻松地减少胶水代码

在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

LUA可谓是配置文件神器,具体功能用过才知道,接近两年没用了抽了俩小时熟悉了下基本的用法。 包括C/LUA堆栈操作 函数相互调用 以及LUA的闭包 C++和LUA相互闭包 要学习LUA首先要理解LU...
  • yue7603835
  • yue7603835
  • 2014年12月05日 05:13
  • 1871

深入理解Lua的闭包一:概念、应用和实现原理

本文首先通过的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理。 闭包的概念 在Lua中,闭包(closure)是由一个函数和该函数会访问到的非局部变量(或者是...
  • MaximusZhou
  • MaximusZhou
  • 2015年03月15日 20:25
  • 7530

lua闭包全面解析

在lua中,闭包(closure)是由一个函数和该函数会访问到的非局部变量(或者是upvalue)组成的,其中非局部变量(non-local variable)是指不是在局部作用范围内定义的一个变量,...
  • peter_teng
  • peter_teng
  • 2016年10月07日 16:30
  • 1059

最近比较流行LUA闭包,顺便了解下原理并记录使用方式

一开始看闭包没理解,感觉这个特性像个bug,局部变量在函数退出后没有销毁,还能反复累加不是个bug嘛,理解后感觉闭包也是一个比较方便的开发方式。下面就是lua闭包的简单使用方式,原理就是函数内部的嵌套...
  • zhouxicai
  • zhouxicai
  • 2016年06月03日 17:37
  • 1048

Lua_Lua中的闭包小结

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结。希望对大家学习Lua有帮助。 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的...
  • c201038795050
  • c201038795050
  • 2015年11月07日 17:09
  • 454

lua学习笔记之二(C/C++程序员的Lua快速入门[进阶话题])

进阶话题 1.函数闭包 1.1 实例代码 function createCountdownTimer(second) local ms = second * 1000 --ms为co...
  • my183100521
  • my183100521
  • 2013年10月28日 14:23
  • 2033

函数闭包的方式实现lua面向对象

除了前文说到的面向对象的方式,lua还可以通过如下的函数闭包的方式实现面向对象。 People = function (name) self = {} local init = fu...
  • xingxiliang
  • xingxiliang
  • 2014年02月21日 00:24
  • 1869

lua 函数的闭包

function newCounter() local i = 0 return function() -- anonymous function i = i + 1 ret...
  • huangzeyy
  • huangzeyy
  • 2011年08月22日 13:33
  • 3544

Lua的upvalue和闭包

Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。假设函数f2定义在函数f...
  • jiayichendddd
  • jiayichendddd
  • 2014年05月07日 15:41
  • 3458

关于Lua的面向对象和闭包的理解

①Lua的面向对象实现是通过各种语法糖来实现的,function t:a(…)会被转换为t.a=function(self,…),而t:a(…)会被翻译为t.a(t,…)。同时t.a又会被翻译成t[“...
  • gh877916059
  • gh877916059
  • 2017年04月09日 15:33
  • 108
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua 闭包快速入门
举报原因:
原因补充:

(最多只允许输入30个字)