Lua中使用轻量用户数据的用例是什么?

我正在使用 userdata 将东西传递给 Lua 中的元表,并调用 C++。我想知道,也许 light userdata 可以帮助我解决我遇到的一些问题。

light userdata 是一个 void*,但是在 Lua 中你不能用它做什么,至少这是我理解的,你只能传递它并一些通过函数调用回到 C++。

你如何使用 light userdata?如果有人有他们用过的一些用例,这将有助于我理解它们。

谢谢。

原文链接 https://stackoverflow.com/questions/9936792

点赞
stackoverflow用户108741
stackoverflow用户108741

我认为在 Lua 中编程很好地解释了它:

轻量级用户数据的真正用途来自于相等性。由于完全用户数据是一个对象,只有它自己才相等。而轻量级用户数据则表示一个 C 指针值。因此,它等于任何表示相同指针的用户数据。因此,我们可以使用轻量级用户数据在 Lua 中找到 C 对象。

例如,假设我们正在实现 Lua 和一个窗口系统之间的绑定。在这个绑定中,我们使用完全用户数据来表示窗口。(每个用户数据可能包含整个窗口结构或只包含系统创建的窗口的指针。)当窗口中有事件发生时(例如,鼠标单击),系统调用特定的回调并通过其地址标识窗口。为了将回调传递给 Lua,我们必须找到表示给定窗口的用户数据。为了找到这个用户数据,我们可以保持一个表,其中索引是带有窗口地址的轻量级用户数据,而值是表示 Lua 中的窗口的完全用户数据。一旦我们有了窗口地址,我们就将其作为轻量级用户数据推入 API 栈中,并将用户数据用作该表的索引。(请注意,该表应该具有弱值。否则,这些完全用户数据将永远不会被收集。)

该页面还解释了轻量级用户数据不会被垃圾收集,因此必须由您的代码进行内存管理。对我而言,使用案例实际上相当有限,这可能就是为什么无法找到许多示例的原因。我找到了一个示例:

我有一个从 lua 表构建 gui 对象(树状视图)的例程。然后我有一个单独的 lua 表,以每个树节点的窗口句柄为索引,作为轻量级用户数据。这简化了 c/lua 接口——我可以使用 c 句柄来查找适当的 lua 表对象。

// 保存窗口句柄
lua_pushlightuserdata(L, hKey);
lua_pushvalue(L,filt); // filter 表中的副本
lua_settable(L, treeindex);

// 查找窗口句柄的数据
lua_pushstring(L, "__treeitems");
lua_gettable(L, LUA_GLOBALSINDEX);
lua_pushlightuserdata(L, hKey);
lua_gettable(L, -2);
2012-03-30 03:59:15
stackoverflow用户1086351
stackoverflow用户1086351

一个典型的使用情况是将Lua嵌入到另一个应用程序中,并且希望为Lua作者提供一些令牌(以轻量级用户数据的形式),以便他们可以将这些令牌传递给您设置的API。以下是一个具体的例子。

假设您为人和朋友提供了以下Lua API:

GetPersonCount() // 返回数字
GetPerson(index) // 返回一个轻量级用户数据,即指向C ++版本的指针

这些将使您通过您的绑定访问'friend'对象

GetFirstName(person)
GetLastName(person)
GetFriendCount(person)
GetFriend(person, index) // 也会像GetPerson一样返回用户数据

如果您已经构建了一个用于获取有关朋友信息的C ++程序,但是希望通过更简单且有限的接口使其可供在Lua中编写脚本的人在运行时安全地访问,而不需要编译或源代码,则这将非常有用。

2012-03-31 18:53:00