2010-07-23 27 views
2

我正在学习如何将C++对象绑定到Lua上,并且从Programming Gems 6(Chapter 4.2)这本书中进行了类型检查。对于类型检查用户数据/串对被存储在一个环境表,用代码给出如何做到这一点:为什么在添加到Lua中的表时推送重复密钥?

void Binder::pushusertype(void* udata, const char* tname) { 
lua_pushlightuserdata(L, udata); // push address 
lua_pushvalue(L, -1); // duplicate address 
lua_pushstring(L, tname); // push type name 
lua_rawset(L, LUA_ENVIRONMENTINDEX); // envtable[address] = tname 
} 

在粘合剂类有一个lua国家作为一个属性,名为“L”

正如你所看到的地址被推两次。由于这段代码只是作为一个例子给出,它似乎并没有被推入堆栈的重复地址可以用于这个函数之外的任何目的,这使我相信它有一个特定的原因。所以我的问题是,为什么会这样做?

回答

2

你没有。

lua_rawset会弹出tname &重复关闭堆栈,但会将原始用户数据留在堆栈上。 我不确定它是否有拼写错误(看起来不太可能),我想可能以后需要它。 不知道在书中是否还有更多,提到这一点,但这就是代码将会做什么。

2

这个函数做两件事情:

它推动一个lightuserdata对象到堆栈,这将是在LUA堆叠位置-1在函数返回时。它还更新当前的功能环境,存储在表键address(等于udata)的名称tname。如果当前功能环境是正常的全球环境下,相当于Lua代码是:

local x = <udata as lightuserdata> 
_G[x] = <tname> 

一个x重复被用来做_G[x] = ...的事情,其他的留在堆栈当函数返回时(一致以push开头的函数名称)。

相关问题