Почему новый прокси Lua устарел и был удален?

Итак, в Lua 5.1 newproxy устарела. В 5.2 его убрали. Но почему? Что я должен использовать сейчас для создания пользовательских данных?

Я пытаюсь реализовать псевдоклассы для удовольствия, а пользовательские данные намного проще. Они значительно упрощают реализацию неизменности и ограничение записи на определенные ключи.


person incapaz    schedule 20.02.2020    source источник
comment
Вы не можете создавать пользовательские данные из сценария Lua. Используйте таблицы и их метатаблицы.   -  person Egor Skriptunoff    schedule 20.02.2020
comment
@EgorSkriptunoff Таблицы Lua ... толстые. Пустая таблица занимает около 40 байт. Это также усложняет реализацию неизменности. Поскольку __newindex всегда вызывается для не-таблиц, это упрощает задачу. Если нет другого пути. С прокси-таблицами по-прежнему слишком много работы.   -  person incapaz    schedule 20.02.2020
comment
Пустая таблица занимает 72 байта. newproxy не требуется в Lua 5.2+   -  person Egor Skriptunoff    schedule 21.02.2020
comment
Они значительно упрощают реализацию неизменяемости и ограничение записи по определенным ключам. Как? Если вы реализуете метаметоды index и newindex, вы можете сделать то же самое с пустой таблицей, что и с пользовательскими данными. И вы должны реализовать их в пользовательских данных, если хотите предоставить им участников. Так в чем разница, кроме функции, которую вы используете для их создания?   -  person Nicol Bolas    schedule 21.02.2020
comment
Вы всегда можете создать простой модуль C с помощью этой функции.   -  person moteus    schedule 21.02.2020


Ответы (2)


Вы, вероятно, вообще не должны были использовать newproxy таким образом, я не уверен, что он вообще делал то, что вы думали.

Функция newproxy была недокументирована, она, вероятно, была удалена, потому что она стала избыточной из-за документированных функций в 5.2.

8.1.6 новый прокси удален.

Это всегда была «недокументированная» функция в Lua 5.1, и она считалась ненужной, поскольку в основном использовалась для написания финализаторов. Поскольку метаметод __gc теперь работает для таблиц Lua, этот обходной путь больше не нужен. - Что ломается в коде Lua 5.1 в Lua 5.2

Вы также ничего не найдете в Руководстве по Lua 5.2 — Раздел 8 Несовместимости с предыдущей версией относительно newproxy, так как это не было задокументировано.

person Nifim    schedule 20.02.2020

В 5.1 были некоторые несоответствия между функциональностью метатаблиц пользовательских данных и таблицы (оператор # не вызывал __len в 5.1 при использовании в таблице). В версии 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. Например, способ создания прокси с заданной метатаблицей, а не предоставление ему таблицы/пользовательских данных с метатаблицей.

person Nicol Bolas    schedule 20.02.2020
comment
@EgorSkriptunoff: На редактирование ушло бы меньше времени, чем на написание комментария. - person Nicol Bolas; 21.02.2020
comment
Да. Но комментарий позволит вам запомнить, что Lua — это не Python ;-) - person Egor Skriptunoff; 21.02.2020