2 votes

Lua : comment créer une méthode personnalisée sur toutes les tables

Je voudrais créer un contient sur la méthode de Lua table structure de données qui vérifierait l'existence d'une clé. L'utilisation ressemblerait à ceci :

mytable  = {}
table.insert(mytable, 'key1')
print(mytable.contains('key1'))

Merci.

8voto

Michal Kottman Points 8682

En Lua, vous ne pouvez pas modifier TOUTES les tables à la fois. Vous pouvez le faire avec des types plus simples, comme les nombres, les chaînes de caractères, les fonctions, où vous pouvez modifier leur métatable et ajouter une méthode à toutes les chaînes de caractères, toutes les fonctions, etc. Cela est déjà fait dans Lua 5.1 pour les chaînes de caractères, c'est pourquoi vous pouvez le faire :

local s = "<Hello world!>"
print(s:sub(2, -2)) -- Hello world!

Les tableaux et les données utilisateur comportent des métatables pour les éléments suivants chaque cas . Si vous voulez créer une table avec une méthode personnalisée déjà présente, un simple constructeur de table ne fera pas l'affaire. Cependant, en utilisant le sucre syntaxique de Lua, vous pouvez faire quelque chose comme ceci :

local mytable = T{}
mytable:insert('val1')
print(mytable:findvalue('val1'))

Pour ce faire, vous devez écrire ce qui suit avant d'utiliser l'option T :

local table_meta = { __index = table }
function T(t)
    -- returns the table passed as parameter or a new table
    -- with custom metatable already set to resolve methods in `table` 
    return setmetatable(t or {}, table_meta)
end

function table.findvalue(tab, val)
    for k,v in pairs(tab) do
        -- this will return the key under which the value is stored
        -- which can be used as a boolean expression to determine if
        -- the value is contained in the table
        if v == val then return k end
    end
    -- implicit return nil here, nothing is found
end

local t = T{key1='hello', key2='world'}
t:insert('foo')
t:insert('bar')
print(t:findvalue('world'), t:findvalue('bar'), t:findvalue('xxx'))
if not t:findvalue('xxx') then
    print('xxx is not there!')
end

--> key2    2
--> xxx is not there!

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