所以在 Lua 的 5.1 中,newproxy
被弃用了。在 5.2 中,它被删除了。但为什么?我现在应该使用什么来构建用户数据?
我正在尝试实现伪类以获得乐趣,并且用户数据更容易。它们使实现不变性和限制对某些键的写入变得更加容易。
你可能根本不应该那样使用newproxy
,我不确定它是否在做你认为它在做的事情。
该newproxy
功能未记录在案,它可能已被删除,因为它在 5.2 中已被记录的功能变得多余。
8.1.6 newproxy 被移除。
这在 Lua 5.1 中一直是一个“未记录”的函数,并且被认为是不必要的,因为它主要用于编写终结器。由于元
__gc
方法现在适用于 Lua 表,因此不再需要此解决方法。- Lua 5.2 中的 Lua 5.1 代码中断了什么
您也不会在Lua 5.2 手册 - 第 8 节与先前版本的不兼容性中找到任何关于newproxy
它未记录的内容。
在 5.1 中,userdata 和表的元表功能之间存在一些不一致(当在表上使用时,#
运算符在 5.1 中没有调用__len
)。5.2 删除了那些不一致的地方,所以表的元表和用户数据的元表之间没有区别。
因此,没有必要这样做。编写一个接近精确的等价物非常容易,newproxy
唯一的区别是返回的对象的类型:
function newproxy(new_meta)
local proxy = {}
if(new_meta == true) then
local mt = {}
setmetatable(proxy, mt)
elseif(new_meta == false)
else
--new_meta must have a metatable.
local mt = getmetatable(new_meta)
setmetatable(proxy, mt)
end
return proxy
end
当然,既然你正在编写一个新函数,你也可以给它一个改进的 API。例如一种使用给定元表创建代理的方法,而不是给它一个具有元表的表/用户数据。