lua语言中闭包的学习心得

lua语言有如下两个特点:

1.lua中的函数可以被存放在变量、表中,也可以作为函数的参数,还可以作为函数的返回值,如:

      func = function()

        print("Hello");

      end

  等价于

      function func()

        print("Hello");

      end

  这两种写法都是函数func()的定义;并且下面这个例子:

      function func()

        return function()  print("Hello");  end  --函数作为返回值

      end

      local f1 = func();

      print(f1);            --运行结果:function:00379738

      f1();              --运行结果:Hello

  是函数作为函数返回值的情况,其中f1是func()内部返回的函数,打印出来为函数在内存中的地址,f1()调用了内部函数,执行后打印出了"Hello"结果。

2.被嵌套的函数可以访问他外部函数中的变量(这个比较强悍,C语言只能访问全局的或以参数形式传入)。

  看如下例子:

    function func()

      local index = 0;        

      local inner = function()

        print(index);      

        index = index + 1;

      end

      inner();            --打印结果:0

      inner();            --打印结果:1

      print(index);           --打印结果:2

    end

    func();

  说明了func()中的局部变量index是可以在inner()中被使用和更改的,index被称为inner()的upvalue。

以上这两点是构成闭包的基础,也是lua语言的强大和灵活之处。

另外,将上面例子稍加改造,如下:

    function func()

      local index = 0;

      print("Hello");

      return function()

        print(index);

        index = index + 1;

      end

    end

    local inner = func();    --调用func()函数,返回内部函数给inner,打印结果:"Hello"

    print(inner);        --打印结果:function:0037BE88

    inner();          --调用内部函数,打印结果:0

    inner();          --调用内部函数,打印结果:1

    local other = func();    --获取另一个内部函数实例,打印结果:"Hello"

    other();          --调用另一个内部函数实例,打印结果:0

    other();          --同上,打印结果:1

由此可以看出函数的局部变量是可以保存在函数内部的,通过调用该函数内嵌的函数可以获取并修改局部变量的值,该函数的局部变量(upvalue)和内嵌函数的组合使用,形成了闭包,这看起来与C++中类的成员变量有些类似。函数具有闭包的功能后,不必再担心其局部变量没办法保存了,这一点对程序员的影响是很大的。

还有如下例子:

    function func();

      local index = 0;

      return function()

        index = index + 1;

        return index;

      end

    end

    local inner = func();

    print(inner());      --打印结果:1

    print(inner());      --打印结果:2

调用了func()的内部函数实例,并将函数调用结果打印了出来,是个很好的保存局部变量的方式。

另外闭包常用于泛型for的迭代器中,由于太晚了,就不再赘述了。有问题欢迎讨论拍砖。

时间: 2024-10-29 19:12:01

lua语言中闭包的学习心得的相关文章

跟我一起了解Lua语言中的_index,newindex,rawget和rawset

前言:理解Lua语言中的__index, __newindex, rawget和 rawset 在谈及Lua中的__index, __newindex, rawget和rawset前,需要理解Lua中的元表这个概念. 一.元表的概念 对Lua中元表的解释: 元表可以改变表的行为模式. 这里举个例子: Window = {} Window.prototype = { x = 0 , y = 0 , width = 100 , height = 100, } Window.mt = {} funct

swift中闭包的学习。

在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用. 闭包定义:  {(类型列表) -> 返回值 in // 多条swift语句 // 执行代码  insert coding } 实际创建闭包代码如下: 1 var square = {(value1 value1:Int,value2 value2:Int)->Int in 2 // 代码块 3 if value1>value2{ 4 return value1 5 } 6 return

Lua语言中的__index,__newindex,rawget和rawset

转自:http://blog.csdn.net/wangbin_jxust/article/details/12108189 在谈及Lua中的__index,__newindex,rawget和rawset前,需要理解Lua中的元表这个概念. 零.元表的概念 对Lua中元表的解释: 元表可以改变表的行为模式. 这里举个例子: Window = {} Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} Window.mt =

javascript-词法作用域规则-作用域链-闭包运用学习心得

虽然在平时貌似,很习以为常的一些用法但是真要弄清这几个概念的时候,确实费了很大功夫,现在虽然不能说明白但总算有了一些心得.好吧下面直接开始 注本文(*)为相关链接 例子1.1 词法作用域规则:函数的嵌套关系是定义时决定的,而非调用时决定的,即词法作用域,即嵌套关系是由词法分析时确定的,而运行时决定. (*)http://blog.csdn.net/zzulp/article/details/8144520 (*)http://www.cnblogs.com/lhb25/archive/2011/

安卓开发中Sqlte的学习心得

访问android的关系型数据库SQLite,必须用到SQLiteOpenHelper这样的类. 如果不用这个类比较麻烦复杂.既然有这样的类,直接用就好了. SQLiteOpenHelper是助手类,对数据库的创建和版本管理进行操作的.通过继承类,来复写一些方法,来实现对数据库的操作. getReadableDatabase()创建或者打开一个数据库.创建或者打开的数据库是可读的. 查询数据是读操作.增加.删除.修改是写操作. SQLitedatabase是提供管理SQLite数据库的一些方法.

2019年3月21日 从小白到区块链工程师:第一阶段:Go语言中的函数学习(6)

一. 为什么要有函数 我们在以后的编码过程中,有很多代码会重复出现,这些重复实现的代码,我们不需要每次需要用到的时候都编写,我们将重复的代码封装起来.比如在一个网站中,无论是消费的金额还是积分的积累等等都需要用到“加法”的功能,所以我们可以将数据相加封装成一个函数,以后凡是用到加法的功能我们都可以直接调用. 二. 函数定义的语法格式 语法格式: 1:基本函数语法(无参,无返回值值得类型) func 函数名称(){ //--换行-- 主函数的代码体 } 示例如下: 2:带参数的函数语法 func

Lua语言基础汇总(5) -- 闭包

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 1 2 3 4 5 6 7 8 9 10 11 function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           retur

[转]Lua语言基础汇总(5) -- 闭包

前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 1 2 3 4 5 6 7 8 9 10 11 function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           retur

Lua脚本编程:Lua语言入门

Lua是一门简单而强大的语言,其本身强大的扩展性使得这门语言在游戏设计等领域发挥着重要的作用.博主曾在Unity3D中使用过这门语言,并且针对Lua和Unity.C++等方面的内容进行了学习和讨论.最近因为在[游戏脚本高级编程]这本书中详细介绍了Lua脚本的相关内容,因此在这里记录下博主的读书心得,方便以后在需要的时候查阅. Lua系统构成 Lua系统由Lua链接库.Luac编译器.Lua解释器三部分构成. * Lua链接库主要由lua.lib和lua.h这两个文件组成.Lua链接库主要负责对自