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代码中,你都可以自由地使用这个特性,轻松地减少胶水代码

相关文章推荐

Lua简明快速入门(1)

Lua简明快速入门Lua简明快速入门 运行 打印信息Hello Lua 注释 变量 数字 字符串 nil 全局变量和局部变量 控制语句 if-else分支 for循环 while循环 until循环 ...

Lua脚本之语法基础快速入门

Lua的语法基础超级简单,非常易于上手,下面总结一些学习过程中的Lua语法基础。 在开始学习之前,先介绍一些最基本的概念,在Lua中具有一个代码块的概念,每个函数或者for循环等都是一个代码块...

Lua 语言 15 分钟快速入门

英文原文:Learn Lua in 15 Minutes 参与翻译(2人): LinuxQueen, 桔子 仅中文 | 中英文对照 | 仅英文 | 打...

Lua 语言 15 分钟快速入门(转)

转载:http://www.oschina.net/translate/learn-lua-in-15-minutes -- 两个横线开始单行的注释 --[[ 加上两个[和]表示 ...
  • bine_
  • bine_
  • 2015-07-21 19:42
  • 479

Lua快速入门技巧

-- 单行注释 --[[ [多行注释] --]] ---------- - 1. 变量 & 控制流 ---------- num = 23 -- 数字都是双精度 str = 'aspyth...

Lua语言15分钟快速入门

Lua语言15分钟快速入门 -- 单行注释 --[[ [多行注释] --]]---------- - 1. 变量 & 控制流 ---------- num = 23 -- 数字都是双精度 st...

Lua 基本语法快速入门

Lua语法与C语言有些相似也不太一样,写了语句学一下         --begin a = --[[explain]] "ha"; print(a) if a == "ha" t...

Lua 语言 15 分钟快速入门

原文地址:http://blog.jobbole.com/70480/ -- 单行注释 --[[ [多行注释] --]] ---------- - 1. 变量 & 控制流 -------...

lua快速入门

运行 首先,我们需要知道,Lua是类C的,所以,他是大小写字符敏感的。 下面是Lua的Hello World。注意:Lua脚本的语句的分号是可选的,这个和GO语言很类似。 复制代...

Lua脚本之语法基础快速入门

Lua的语法基础超级简单,非常易于上手,下面总结一些学习过程中的Lua语法基础。 点击打开链接 在开始学习之前,先介绍一些最基本的概念,在Lua中具有一个代码块的概念,每个函数或者fo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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