Differenze tra le versioni di "Modulo:Wikilib/tables"

Jump to navigation Jump to search
Rimossi parametri sequential e inPlace da table.map: il primo era inutile, il secondo dava problemi con table.filter, quindi è stato rimosso per uniformità, essendo una feature non indispensabile. Aggiunti metodi table.equal, table.merge e table.filt...
(Inserite funzioni deepSearch e map)
(Rimossi parametri sequential e inPlace da table.map: il primo era inutile, il secondo dava problemi con table.filter, quindi è stato rimosso per uniformità, essendo una feature non indispensabile. Aggiunti metodi table.equal, table.merge e table.filt...)
has been found, thus returning
--]]
local valueKeyvalueKeys = {table.deepSearch(v, value)}
iflocal last = table.remove({valueKey}valueKeys) then
returnif k,last valueKeythen
return k, unpack(valueKeys), last
end
end
--[[
 
Applica una funzione ad ogni elemento di una table.,
ritornandone un'altra con i risultati aventi la stessa
chiave dell'elemento dato in ingresso alla funzione
 
La funzione riceve in ingresso un elemento e la sua
placeholder.
 
--]]
Il risultato viene ritornato in una nuova table, se
inPlace è false, altrimenti viene modificata quella
in ingresso.
 
table.map = function(tab, funct)
L'ordine in cui gli elementi sono processati è casuale
local dest = {}
se sequential è false, sequenziale (per i soli indici
for key, value in pairs(tab) do
numerici) altrimenti.
dest[key] = funct(value, key)
end
return dest
end
 
t.map = table.map
Tab e funct non hanno valori default per ovvi motivi,
 
mentre sequential e inPlace lo hanno entrambi a false
--[[
 
Indica se due tables sono uguali, nel più
brutale dei possibili significati: stessi
elementi associati alle stesse chiavi.
 
Per comodità, ritorna true anche se gli
argomenti non sono tables, purché siano
uguali.
 
--]]
 
table.mapequal = function(tabtab1, funct, sequential, inPlacetab2)
 
local dest = inPlace and tab or {}
--[[
local iterator = sequential and ipairs or pairs
Si confrontano direttamente gli argomenti se
for key, value in iterator(tab) do
uno dei due ha il metamethod __eq o se uno
dest[key] = funct(value, key)
dei due non è una table
--]]
local mt1 = getmetatable(tab1)
local mt2 = getmetatable(tab2)
if mt1 and mt1.__eq or mt2 and mt2.__eq
or type(tab1) ~= 'table'
or type(tab2) ~= 'table' then
return tab1 == tab2
end
--[[
Se si hanno due riferimenti alla stessa
table si evitano molte computazioni inutili
--]]
if tab1 == tab2 then
return true
end
 
--[[
Se il numero di elementi è diverso le due
tables non possono essere uguali. Inoltre
gestisce anche il caso in cui tab1 sia vuota
e tab2 no, che porterebbe a tornare true
poiché il loop viene skippato, e quello in
cui tab1 sia un sottoinsieme di tab2 poiché
si controllano solo gli indici della prima.
--]]
if table.getn(tab1) ~= table.getn(tab2) then
return false
end
for key, value in pairs(tab1) do
--[[
Stante la type safety di table.equal, è
più comodo fare così
--]]
if not table.equal(value, tab2[key]) then
return false
end
end
return true
end
 
table.eq = table.equal
t.equal, t.eq = table.qual, table.equal
 
--[[
 
Ritorna una table risultato della fusione delle
due passate. Gli indici numerici della seconda
seguiranno quelli della prima; gli altri sono
lasciati invariati, ed in caso di uguaglianza
quelli della seconda sovrascrivono quelli della
prima.
 
--]]
 
table.merge = function(tab1, tab2, inPlace)
 
local dest = mw.clone(tab1)
--[[
È necessario il doppio ciclo per avere
le chiavi intere in ordine
--]]
for key, value in ipairs(tab2) do
table.insert(dest, value)
end
for key, value in pairs(tab2) do
if type(key) ~= 'number'
or key ~= math.floor(key) then
dest[key] = value
end
end
return dest
end
 
t.mapmerge = table.mapmerge
 
--[[
 
Ritorna una table con i soli elementi che
rispettano la condizione passata. Tale
funzione deve quindi ritornare un booleano,
avendo in ingresso un elemento e la sua
chiave, in quest'ordine perché la chiave
non è sempre necessaria e sarebbe fastidioso
avere un argomento placeholder.
 
Le chiavi rimangono invariate con la sola
eccezione di quelle numeriche, che sono
rese continue
 
--]]
 
table.filter = function(tab, cond)
local dest = {}
--[[
È necessario il doppio ciclo per avere
le chiavi intere in ordine
--]]
for key, value in ipairs(tab) do
if cond(value, key) then
table.insert(dest, value)
end
end
for key, value in pairs(tab) do
if (type(key) ~= 'number'
or key ~= math.floor(key))
and cond(value, key) then
dest[key] = value
end
end
return dest
end
 
t.filter = table.filter
 
return t
106 665

contributi

Menu di navigazione