Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Lua中添加到表时,为什么要按重复键? 我正在学习如何用从编程GEMS 6中的类型检查来绑定C++对象到Lua(第4.2章)。对于类型检查,userdata/字符串对存储在环境表中,代码给出了如何执行此操作: 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 }_C++_Lua - Fatal编程技术网

在Lua中添加到表时,为什么要按重复键? 我正在学习如何用从编程GEMS 6中的类型检查来绑定C++对象到Lua(第4.2章)。对于类型检查,userdata/字符串对存储在环境表中,代码给出了如何执行此操作: 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中添加到表时,为什么要按重复键? 我正在学习如何用从编程GEMS 6中的类型检查来绑定C++对象到Lua(第4.2章)。对于类型检查,userdata/字符串对存储在环境表中,代码给出了如何执行此操作: 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 },c++,lua,C++,Lua,其中绑定类具有一个名为“L”的Lua状态作为属性 如您所见,地址被推送了两次。由于这段代码只是作为一个示例给出的,因此推到堆栈上的重复地址似乎不会在这个函数之外起任何作用,这让我相信这是有特定原因的。所以我的问题是,为什么人们会这样做?你不会 lua_rawset将弹出tname&堆栈中的副本,但将原始用户数据保留在堆栈中。 我不确定这是否是一个打字错误(看起来不太可能),我想以后可能需要它。 我不知道书中是否还有更多提到这一点的内容,但代码就是这么做的。此函数有两个功能: 它将lightuse

其中绑定类具有一个名为“L”的Lua状态作为属性

如您所见,地址被推送了两次。由于这段代码只是作为一个示例给出的,因此推到堆栈上的重复地址似乎不会在这个函数之外起任何作用,这让我相信这是有特定原因的。所以我的问题是,为什么人们会这样做?

你不会

lua_rawset将弹出tname&堆栈中的副本,但将原始用户数据保留在堆栈中。 我不确定这是否是一个打字错误(看起来不太可能),我想以后可能需要它。
我不知道书中是否还有更多提到这一点的内容,但代码就是这么做的。

此函数有两个功能:

它将lightuserdata对象推送到堆栈中,当函数返回时,它将位于lua堆栈位置-1。它还使用存储在表键
地址
处的名称
tname
更新当前功能环境(等于udata)。如果当前功能环境是正常的全局环境,则等效的Lua代码为:

local x = <udata as lightuserdata>
_G[x] = <tname>
local x=
_G[x]=
一个重复的
x
用于执行
\u G[x]=…
操作,另一个在函数返回时留在堆栈上(与以
push
开头的函数名一致)