2010-12-02 20 views
2

J'ai un dictionnaire que j'utilise pour stocker un autre dictionnaire en utilisant le nom d'un paramètre.Stocker un dictionnaire dans un dictionnaire dans Erlang

Je reçois une erreur de concordance côté droit.

ici est mon code

handle_cast({setState, Id}, State) -> 
Id0 = dict:new(), 
DQueue = queue:new(), 
UQueue = queue:new(), 
Id1 = dict:store(dQueue, [DQueue], Id0), 
Id2 = dict:store(uQueue, [UQueue], Id1), 
Id3 = dict:store(dSpeed, [], Id2), 
Id4 = dict:store(uSpeed, [], Id3), 
D = dict:store(Id, [Id4], State), 
State = D, 
{noreply, State}; 

Je ne suis pas sûr où l'erreur vient. Je pensais que c'était parce que je stockais Id comme clé dans le dictionnaire principal avec le nouveau dictionnaire interne comme valeur.

J'ai besoin que le nom du dictionnaire interne soit la valeur de l'Id car il y en aura beaucoup et je dois y accéder par Id plus tard.

Est-ce que je règle correctement le dictionnaire? Est-ce que erlang permet aux dictionnaires de contenir des dictionnaires?

Merci

Répondre

5

Sans essayer le code, mon pari est que vous BadMatch lorsque vous faites State = D étant donné que State est déjà lié dans la tête de la fonction. En plus de cela, USpeed et DSpeed devrait être indéfini, sauf si vous avez copié/collé votre fonction erronée.

+0

Merci. J'ai changé certaines choses. Sa partie d'un projet uni: P je vais éditer ceux maintenant merci. Donc je devrais juste le faire par ex. NewState = D. {noreply, NewState}. ? ;) – jarryd

+0

que ce soit ou juste '{noreply, D}' –

+0

Comment cela affecte-t-il la mémoire? Créer un nouveau Dict lors du stockage, en passant dans le vieux dict? Ou l'écrase-t-il immédiatement? – jarryd

3

Que diriez-vous une ré-écriture:

handle_cast({setState, Id}, State) -> 
    D = dict:from_list([{dQueue, [queue:new()]}, 
         {uQueue, [queue:new()]}, 
         {dSpeed, []}, 
         {uSpeed, []}], 
    {noreply, D}; 

Ce qui est plus simple à lire, évite de nommer des problèmes et est à peu près la même vitesse.

+0

C'est vraiment bon. Comme plus tard dans ce module, je stocke des dictionnaires dans le dictionnaire principal et la convention de nommage était un combat à suivre. – jarryd