Module:TableBuilder
TableBuilder est un module qui applique aux fonctions de la librairie Table une interface fluide. Le code est ainsi à la fois plus concis et plus clair.
Attention : ce module ne devrait être utilisé que pour des tables séquences, ou au pire des tables dont les éléments sont connus et limités. En effet, ajouter à la table un élément ayant pour index le nom d'une de ces fonctions remplace la fonction par cet élément.
1 Utilisation
Vous devez premièrement charger le module :
local TableBuilder = require('Module:TableBuilder')
Deuxièmement, vous devez instancier le tableau, avec new
pour une nouvelle table, avec set
pour une table existante, ou en clonant une table existante.
local tab1 = TableBuilder.new()
TableBuilder.set(tab2)
local tab1 = TableBuilder.clone(tab3)
Ensuite, vous pouvez utiliser les méthodes énumérées dans la librairie Table (insert
, remove
, sort
, maxn
) ou une des fonctions spécifiques décrites ci-dessous.
Enfin, vous devez concaténer la table en utilisant la méthode concat()
:
tab.concat()
2 Fonction specifique
minsert( ... )
— permet des inserts multiples, pour ajouter en une opération plusieurs éléments à la fin de la table. Les paramètres nil passés à la fonction sont ignorés.
tinsert( table2, i, j )
— ajoute à la fin de la table les élémentstable2[i]
àtable2[j]
. La valeur par défaut dei
est 1, et la valeur par défaut dej
est la longueur de la table. Sii
est plus grand quej
aucun élément n'est ajouté.
3 clone
TableBuilder.clone
duplique une table existante, de façon récursive.
Contrairement à mw.clone, cette fonction ne clone pas la meta-table, mais utilise la meta-table de TableBuilder. Ceci permet notamment de modifier une table chargée par mw.loadData
.
Cette fonction ne devrait pas être utilisée sur la totalité de la table chargée par loadData (utiliser require
sera plus économe en mémoire) mais sur une petite sous-table.
4 Exemples
local TableBuilder = require( 'Module:TableBuilder' )
local date = { 'Cet exemple a été modifié le' }
TableBuilder.set( date )
date.insert( "4" )
.insert( "2013" )
.insert( 3, "septembre" )
local time = TableBuilder.new()
local heure, minute = "12", "8"
local seconde
time.minsert( "à", heure, "heures et", minute, "minutes", seconde, seconde and "secondes" )
date.tinsert( time )
local s = date.concat( ' ' ) .. "."
--s = 'Cet exemple a été modifié le 4 septembre 2013 à 12 h et 8 minutes.'
--Module appliquant aux fonctions de la librairie Table une inteface fluide.
local meta = {
insert = function ( t, ... )
table.insert( t, ... )
return t
end,
remove = function ( t, ... )
table.remove( t, ... )
return t
end,
sort = function ( t, ... )
table.sort( t, ... )
return t
end,
maxn = function ( t )
return table.maxn( t )
end,
concat = function ( t, ... )
return table.concat( t, ... )
end,
minsert = function( t, ... )
local sel
for i = 1, select( '#', ... ) do
sel = select( i, ... )
if sel then
table.insert( t, sel )
end
end
return t
end,
tinsert = function( t, tab, first, last )
if type( tab ) == 'table' then
for i = ( tonumber( first ) or 1 ), ( tonumber( last ) or #tab ) do
table.insert( t, tab[i] )
end
end
return t
end,
}
meta.__index = function ( t, key )
local metafunc = meta[key]
if type( metafunc ) == 'function' then
return function ( ... ) return metafunc( t, ... ) end
end
end
-- fin des fonctions de la meta-table
local TableBuilder = {
new = function( ... )
local t = { ... }
setmetatable( t, meta )
return t
end,
set = function( t )
if type( t ) == 'table' then
setmetatable( t, meta )
end
return t
end,
clone = function ( t )
local tableRefs = { }
local function recursiveClone( val )
if type( val ) == 'table' then
-- Encode circular references correctly
if tableRefs[val] ~= nil then
return tableRefs[val]
end
local retVal = { }
tableRefs[val] = setmetatable( retVal, meta )
for key, elt in pairs( val ) do
retVal[key] = recursiveClone( elt )
end
return retVal
else
return val
end
end
return recursiveClone( t )
end,
}
return TableBuilder