Lua中共享upvalue是个怎么样的用法?

发布于 2022-09-02 12:58:01 字数 944 浏览 18 评论 0

今天看云风的enjoy2D源码,发现有个Lua的upvalue用法不太明白,简单的测试代码如下


test.cpp

#include<iostream>
extern "C"
{
#include"lua.h"
#include"lauxlib.h"
#include"lualib.h"
}
using namespace std;

static int
ltest(lua_State *L)
{

    lua_getfield(L, lua_upvalueindex(1), "a");
    cout << lua_tointeger(L, -1) << endl;
    return 1;
}

static int
luaTest(lua_State *L)
{
    luaL_Reg l[] =
    {
        {"test",ltest},
        {NULL,NULL},
    };
    luaL_newlibtable(L, l);
    lua_pushvalue(L, -1);
    luaL_setfuncs(L, l, 1);
    return 1;
}

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luaL_requiref(L, "LuaTest", luaTest, 0);
    luaL_dofile(L, "a.lua");
    return 0;
}

a.lua

local c=require"LuaTest"
c.a=50
c.test()

为什么对LuaTest这个模块设置一个表作为上值之后,直接用“a”索引上值的表就能取出50呢?
翻了一下《Programming in Lua, 3rd Edition》,里面确实也是有这个用法,但是没有讲太详细,求解答。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼波传意 2022-09-09 12:58:01

//创建一个库table
luaL_newlibtable(L, l);
//压入一个upvalue 也就是这个表自身
lua_pushvalue(L, -1);//这句你可以注释掉测试一下,并且luaL_setfuncs最后一个参数设为0。

//为这个表注册函数   ,并且设置1个upvalue
luaL_setfuncs(L, l, 1);


//这个函数就有了这个libtable的环境(也就是upvalue)
static int ltest(lua_State *L);


//lua_upvalueindex是一个宏。  你可以打开看一下  ,他会返回一个当前环境的伪索引,指向这个函数的环境 (upvalue),  参数填的是1,也就说明一个clua函数是可以设多个环境的,填1就是读第一个环境

--载入c库
local c=require"LuaTest"
--给这个table创建一个整数a成员  
c.a=50
--调用clua函数,  
--这个c函数在注册的时候就给他绑定了这个table的环境,
--并且将c函数赋值给table的test成员
c.test()

不知道这样讲能行吗,好多没用lua了,忘差不多了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文