Почему newproxy Lua устарел и был удален? - PullRequest
2 голосов
/ 20 февраля 2020

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

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

Ответы [ 2 ]

2 голосов
/ 21 февраля 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. Например, способ создания прокси с заданным метатабилем, а не предоставление ему таблицы / пользовательских данных с метатабилем.

2 голосов
/ 21 февраля 2020

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

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

8.1.6 newproxy удален.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...