• LUA upvalues


    1 upvalue概念

    upvalue:嵌套函数的外部函数的局部变量

    function func(a) <== 这个函数返回值是一个函数

    return function ()

        a = a + 1    <== 这里可以访问外部函数func的局部变量a,这个变量a就是upvalue

        return a

    end

    end

    func返回一个匿名函数,可用变量接取之。该匿名函数有一个upvalue a(有点像C函数的static变量),初值为首次调用func时的参数

    closure概念

    closure: 一个匿名函数加上其可访问的upvalue

    c = func(1) <== c现在指向一个拥有upvalue a = 1的匿名函数,c也被称作一个闭包

    3 C函数如何向LUA递闭包

    void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n)
    这个函数的作用是在栈上压入一个闭包,
    当一个c函数被创建时, 可以绑定几个值(第三个参数n表面)在它上面, 从而形成一个闭包.  在任何时刻调用这个c函数时, 都可以访问这几个绑定值
    绑定的方法: 先一次压入要绑定的n个值到栈上, 然后调用lua_pushcclosure(L, fn, n)这样就形成的一个c闭

     

    static int _counter (lua_State *L)

    {

        //

        //获取第一个upvalue

        //

        double val = lua_tonumber(L, lua_upvalueindex(1));

     

        lua_pushnumber(L, ++val);

       

     

        /*

        void lua_pushvalue (lua_State *L, int index);

        把栈上给定索引处的元素作一个副本压栈。

        */

        lua_pushvalue(L, -1);

     

        /*

        void lua_replace (lua_State *L, int index);

        把栈顶元素放置到给定位置而不移动其它元素(因此覆盖了那个位置处的值),然后将栈顶元素弹出

        */

        lua_replace(L, lua_upvalueindex(1));

     

        return 1;  /* return new value */

    }

     

    static int counter (lua_State *L)

    {

        lua_pushnumber(L, 0);

        //

        //压入初始化第一个upvalue

        //

        lua_pushcclosure(L, &_counter, 1);

        return 1;

    }

     

     

    void testlupvalue()

    {

        lua_State *L;

     

        L = luaL_newstate();

        luaL_openlibs(L);

        lua_register(L, "counter", counter);

     

        luaL_loadfile(L, "C:\c.lua");

     

        lua_pcall(L, 0,0,0);

     

        lua_close(L);

    }

    closure
  • 相关阅读:
    网页收藏
    background 和IMG的差异
    cefsharp开发实例1
    Node.js系列之node.js初探
    sublime3安装package controller遇到的问题
    java 指定日期加指定天数
    svn 命令
    mac下nodejs 更新到最新版本的最新方法
    mac系统安装redis
    sublime 安装插件
  • 原文地址:https://www.cnblogs.com/sysnap/p/6913737.html
Copyright © 2020-2023  润新知