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

浏览:29日期:2023-05-11

问题描述

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

test.cpp

#include<iostream>extern 'C'{#include'lua.h'#include'lauxlib.h'#include'lualib.h'}using namespace std;static intltest(lua_State *L){ lua_getfield(L, lua_upvalueindex(1), 'a'); cout << lua_tointeger(L, -1) << endl; return 1;}static intluaTest(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=50c.test()

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

问题解答

回答1:

//创建一个库tableluaL_newlibtable(L, l);//压入一个upvalue 也就是这个表自身lua_pushvalue(L, -1);//这句你可以注释掉测试一下,并且luaL_setfuncs最后一个参数设为0。//为这个表注册函数 ,并且设置1个upvalueluaL_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了,忘差不多了。

相关文章: