闭包
- 简单的说闭包是一个函数加上它可以正确访问的 upvalues。
- 技术上来讲,Lua中只有闭包而不存在函数,函数仅仅是闭包的一个原型声明(一种特殊的闭包)
function newCounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
匿名函数使用 upvalue i 保存他的计数,当我们调用匿名函数的时候 i 已经超出了作用范围,因为创建 i 的函newCounter 已经返回了。然而 Lua 用闭包的思想正确处理了这种情况。
如果我们再次调用 newCounter,将创建一个新的局部变量 i,因此我们得到了一个作用在新的变量 i 上的新闭包。
c2 = newCounter()
print(c2()) --> 1
print(c1()) --> 3
print(c2()) --> 2
c1、c2 是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同的闭包。
技术上来讲,Lua中只有闭包而不存在函数,函数仅仅是闭包的一个原型声明(一种特殊的闭包);尽管如此,在不会导致混淆的情况下我们继续使用术语”函数”代指闭包。
词法定界
- 函数可以访问它的外部函数的变量。这个特征是强大的,因为它可以实现很多强大的函数式编程的功能,可以使你的程序更为简短
- 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界。
function sortbygrade (names, grades)
table.sort(names, function (n1, n2)
return grades[n1] > grades[n2] -- compare the grades
end)
end
例子中包含在 sortbygrade 函数内部的 sort 中的匿名函数可以访问 sortbygrade 的参数grades,在匿名函数内部 grades不是全局变量也不是局部变量,我们称作外部的局部变量(external local variable)或者 upvalue。(upvalue 意思有些误导,然而在 Lua 中他的存在有历史的根源,还有他比起 external local variable 简短)。
第一类值
- 在Lua中,函数是和其他类型的值有着同样功能的值,我们可以把它存储在变量中,赋值,并且作为参数和返回值
Lua中的函数:
Lua中的函数是含有 词法定界 的 第一类值 。
Lua中的函数是匿名的,在程序中实际使用的函数名只是承载这个函数的一个变量,我们可以用各种方式来承载函数
函数和其它所有值一样都是没有名字的, 即它们都没有名称.
function foo( x )
return 2*x
end
↑只是一种语法糖而已, 相当于一下代码的一种简化书写形式.
foo = function ( x )
return x*2
end
高阶函数:
- 一个函数接收另一个函数作为参数,如
table.sort,我们称为 高阶函数 ,高阶函数是一个强大的编程系统,有很强的灵活性
table.sort(network, funciton(a, b)
return (a.name > b.name)
end)
参考阅读: lua学习笔记(6)–再说函数
本文深入探讨了Lua中的闭包概念,解释了闭包如何在函数调用中保留对局部变量的访问,强调在Lua中实际上只有闭包而无独立的函数。同时介绍了词法定界,说明函数可以访问外部函数的变量,以及Lua中函数作为第一类值的特性,允许它们存储、赋值和作为参数传递。此外,还提到了高阶函数的概念,即函数可以接受其他函数作为参数,增强了编程的灵活性。
3487

被折叠的 条评论
为什么被折叠?



