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.
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()
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é.
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.
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