温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

lua语言中闭包的学习心得

发布时间:2020-07-01 22:06:12 来源:网络 阅读:541 作者:267211681 栏目:开发技术

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的迭代器中,由于太晚了,就不再赘述了。有问题欢迎讨论拍砖。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

lua
AI