J'ai besoin d'aide avec les méta-tables Lua, notamment avec AutomagicTables (http://lua-users.org/wiki/AutomagicTables). La possibilité d'assigner juste aux tables indéfinies est très gentille, et je voudrais garder cette fonctionnalité. Ma version a été placée dans une seule fonction:Tables Lua avec valeurs par défaut et création automatique de tables
require("dataentry") -- Contains my age function
function AutomagicTable()
-- Create a new data table
-- from https://lua-users.org/wiki/AutomagicTables
local auto, assign
function auto(tab, key)
return setmetatable({}, {
__index = auto,
__newindex = assign,
parent = tab,
key = key
})
end
local meta = {__index = auto}
function assign(tab, key, val)
if val ~= nil then
local oldmt = getmetatable(tab)
oldmt.parent[oldmt.key] = tab
setmetatable(tab, meta)
tab[key] = val
else
return nil
end
end
return setmetatable({}, meta)
end
Ce que je veux passer une table de valeurs par défaut à utiliser lorsqu'un champ n'est pas défini - comme décrit dans le chapitre 13 PIL (https://www.lua.org/pil/13.4.3.html). Cela permettrait des champs calculés et de recherche dans mon strucutre de données. Voici la syntaxe que je veux utiliser:
t_defaults = {
Age = age(table["DOB"]),
Sex = "Female",
}
t = AutomagicTable(t_defaults)
t.ID12345.DOB = "7/2/1965"
t.ID12346.DOB = "1/2/1945"
print("ID12345",t.ID12345.Sex,t.ID12345.DOB,t.ID12345.Age)
print("ID12346",t.ID12346.Sex,t.ID12346.DOB,t.ID12346.Age)
Notez la référence au champ de date de naissance de la table en cours (voir ci-dessous) dans cet âge de code() échoue table [ « date de naissance »] est nul. Si vous exécutez ce code où il n'y a pas de valeurs par défaut, Automagic renvoie une table pour les valeurs manquantes.
Je peux attribuer les valeurs par défaut suivant l'exemple dans PIL Chapitre 13, mais la syntaxe est en désordre et une fois appliqué, je lâche la fonctionnalité AutomagicTable (comme je l'ai attribué un autre métatable):
-- Make a metatables
t_defaults = {}
t_defaults.__index = function (table, key)
local def = {
Age = age(table["DOB"]),
Sex = "Female"
}
return def[key]
end
-- Set new metatable - but now we can't make anymore Automagic tables
setmetatable(t.ID12345, t_defaults)
setmetatable(t.ID12346, t_defaults)
-- This will work
print("ID12345",t.ID12345.Sex,t.ID12345.DOB,t.ID12345.Age)
print("ID12346",t.ID12346.Sex,t.ID12346.DOB,t.ID12346.Age)
-- This assignment fails
t.ID12347.DOB = "12/12/1945"
Malheureusement, je n » Je comprends parfaitement le code AutomagicTables et j'ai du mal à ajouter les fonctionnalités requises dans le code AutomagicTable.
Toute aide reçue avec gratitude.
Gavin
Un grand merci. Votre automagic à un seul niveau est beaucoup plus facile à comprendre. g – Gavin