从纯Lua中创建一个新的空用户数据

我记得 Lua 中有一个本地函数可以返回一个新的 userdata,它是否存在?是否可能从普通 Lua 脚本创建自定义的 userdata?

点赞
用户1601606
用户1601606

实际上,Lua中不支持纯Lua创建userdata类型。userdata类型旨在允许将任意C数据存储在Lua变量中...... 用户数据值不能在Lua中创建或修改,仅能通过C API创建。这确保了由宿主程序拥有的数据的完整性。

链接

如果将luaVM嵌入到宿主C/C++应用程序中,则可以导出一些用于创建userdata的函数到Lua中,但这并不是一个好的实践。userdata类型是为Lua脚本设计的黑盒。

2014-05-11 12:08:24
用户33252
用户33252

你可能正在思考newproxy

来自:http://lua-users.org/wiki/HiddenFeatures

newproxy是Lua基本库中一个不受支持和未记录的函数。从Lua代码中, setmetatable函数只能用于表类型的对象。newproxy函数绕过了这个限制,通过创建一个零大小的用户数据,在其上设置一个新的空元表,或者使用另一个newproxy实例的元表。我们可以从Lua中自由地修改元表。这是创建Lua代理对象的唯一方法,可以使用某些元方法,例如__len

它还可以用于__gc元方法,作为一个hack,当newproxy实例变为自由时得到一个回调。

这个特点存在于Lua5.1中,但在5.2中被移除。在Lua 5.2中,可以在大小为零的表上设置__gc元方法,因此newproxy的主要动力消失了。

2014-05-11 14:11:15