2 votes

Pourquoi la fonction newproxy de Lua a-t-elle été dépréciée et supprimée ?

Donc, dans la version 5.1 de Lua, newproxy a été déprécié. En 5.2, il a été supprimé. Mais pourquoi ? Que dois-je utiliser maintenant pour construire une userdata ?

J'essaie d'implémenter des pseudo-classes pour le plaisir et les userdatas sont beaucoup plus faciles. Elles permettent d'implémenter l'immuabilité et de restreindre l'écriture à certaines clés beaucoup plus facilement.

2voto

Nifim Points 474

Tu n'aurais probablement pas dû utiliser newproxy comme ça, je ne suis pas sûr que ça faisait ce que vous pensiez que ça faisait.

El newproxy n'était pas documentée, elle a probablement été supprimée parce qu'elle était rendue superflue par les fonctionnalités documentées de la version 5.2.

8.1.6 newproxy supprimé.

C'était toujours une fonction 'non documentée' dans Lua 5.1, et elle était considérée comme inutile, puisqu'elle était principalement utilisée pour écrire des finaliseurs. Depuis que le __gc metamethod fonctionne maintenant pour les tables Lua, cette solution de contournement n'est plus nécessaire. - Ce que le code de Lua 5.1 casse dans Lua 5.2

Vous ne trouverez rien non plus dans le Manuel de Lua 5.2 - Section 8 Incompatibilités avec la version précédente concernant newproxy car il n'était pas documenté.

2voto

Nicol Bolas Points 133791

Dans la version 5.1, il y avait certaines incohérences entre la fonctionnalité métatable d'une donnée utilisateur et d'un tableau (la fonction # L'opérateur n'a pas appelé __len en 5.1 lorsqu'il est utilisé sur un tableau). La version 5.2 a supprimé ces incohérences, de sorte qu'il n'y a pas de différence entre la métatable d'une table et celle d'une userdata.

En tant que tel, il n'est pas nécessaire. Il est très facile d'écrire un équivalent quasi exact de newproxy La seule différence est le type de l'objet renvoyé :

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

Bien sûr, puisque vous écrivez une nouvelle fonction de toute façon, vous pouvez aussi lui donner une API améliorée. Par exemple, un moyen de créer des proxies avec une métatable donnée, plutôt que de lui donner une table/donnée utilisateur qui a une métatable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X