2017-03-29 2 views
2

J'ai un fichier d'entrée avec différents types d'alimentsAjout de valeurs supplémentaires aux tables dans Lua

Corn Fiber 17 
Beans Protein 12 
Milk Protien 15 
Butter Fat 201 
Eggs Fat 2 
Bread Fiber 12 
Eggs Cholesterol 4 
Eggs Protein 8 
Milk Fat 5 

(Ne prenez pas ces derniers. Je suis trop au sérieux pas un expert en nutrition) Quoi qu'il en soit, je le script suivant que lit le fichier d'entrée met alors le suivant dans une table

file = io.open("food.txt") 
foods = {} 
nutritions = {} 
for line in file:lines() 
    do 
     local f, n, v = line:match("(%a+) (%a+) (%d+)") 
     nutritions[n] = {value = v} 
     --foods[f] = {} Not sure how to implement here 
    end 
file:close() 

(Il est un peu en désordre en ce moment) Notez également que différents aliments peuvent avoir différents nutriments. Par exemple, les œufs contiennent à la fois des protéines et des matières grasses. J'ai besoin d'un moyen de laisser le programme, savoir quelle valeur j'essaie d'appeler. Par exemple:

> print(foods.Eggs.Fat) 
2 
> print(foods.Eggs.Protein 
8 

Je crois que j'ai besoin de deux tables, comme indiqué ci-dessus. La table des aliments contiendra un tableau des nutritions. De cette façon, je peux avoir plusieurs types d'aliments avec plusieurs faits nutritifs différents. Cependant, je ne suis pas sûr de savoir comment gérer une table de tables. Comment puis-je l'implémenter dans mon programme?

Répondre

2

La méthode directe consiste à tester si food[f] existe, pour décider s'il faut créer une nouvelle table ou ajouter des éléments à une table existante.

foods = {} 
for line in file:lines() do 
    local f, n, v = line:match("(%a+) (%a+) (%d+)") 
    if foods[f] then 
     foods[f][n] = v 
    else 
     foods[f] = {[n] = v} 
    end 
end