2

所以在 Lua 的 5.1 中,newproxy被弃用了。在 5.2 中,它被删除了。但为什么?我现在应该使用什么来构建用户数据?

我正在尝试实现伪类以获得乐趣,并且用户数据更容易。它们使实现不变性和限制对某些键的写入变得更加容易。

4

2 回答 2

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它未记录的内容。

于 2020-02-20T22:01:15.187 回答
2

在 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。例如一种使用给定元表创建代理的方法,而不是给它一个具有元表的表/用户数据。

于 2020-02-20T22:32:52.963 回答