Lua 闭包

闭包

  • 简单的说闭包是一个函数加上它可以正确访问的 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)–再说函数

猜你喜欢

转载自blog.csdn.net/jingangxin666/article/details/80412717