Je travaille avec beaucoup de fichiers de données écrits en Lua. La plupart d'entre eux est écrit de cette manière, un « annuaire téléphonique » comme exemple:Lua, itérateur personnalisé - bonne façon de définir?
data = {
-- First Level - country
USA = {
-- Second level - city
Denver = {
-- Third level - actual entries
{name = 'John', number = '12345'},
-- more entries
},
Washington = {
{name = 'Ann', number = '54321'},
-- more entries
},
-- more cities with entries
},
-- more countries with cities and entries
}
Donc, le fait que le premier niveau est « Pays » et le second est « City » est implicite, mais il rend les données plus compact.
Maintenant, lors de la recherche de certaines données, je voudrais itérer sur ces données en tant qu'entrées , y compris cette information nivelée et implicite.
-- Coroutine yielding entries including level data
function corIter(data)
for country,l1 in pairs(data) do
for city,l2 in pairs(l1) do
for _,entry in pairs(l2) do
-- Copy the entry
local out = {}
for k,v in pairs(entry) do
out[k] = v
end
-- Add level properties
out.country = country
out.city = city
coroutine.yield(out)
end
end
end
end
-- Iterate over the entries
local cor = coroutine.create(corIter)
local _, entry = coroutine.resume(cor, data)
while entry do
-- Handle the entry, has 'name', 'number', 'country' and 'city' keys
table.print(entry) -- (custom print function I use)
-- Get the next one
_, entry = coroutine.resume(cor)
end
Mais je pense que cette approche peut être mauvais, car il garde un peu vivant fil entier à itérer sur une table sacrément d'une manière spécifique.
Y a-t-il une autre solution "évidente" à cela? La clé est la performance et la facilité d'utilisation. Je n'ai pas vraiment besoin d'une solution générale (pour un nombre arbitraire de "niveaux" dans la table de données), mais cela ressemble à un hack.
Pourriez-vous donner un exemple de la requête que vous avez à l'esprit? – lhf