2010-12-02 14 views
2

私はパラメータの名前を使って別の辞書を保存する辞書を持っています。Erlangの辞書に辞書を保存する

右側の不一致エラーが発生します。

は、ここに私のコード

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}; 

イムエラーがどこから来るかわからないです。新しい内部辞書を値としてメイン辞書にIDとしてキーを格納していたためかもしれないと思った。

多くのIDが存在するため、内部の辞書の名前が必要です。後でIDでアクセスする必要があります。

辞書を正しく設定していますか? erlangは辞書に辞書を含めることができますか?コードをしようとせず

おかげ

答えて

5

、私の賭けはStateがすでに機能の頭の中にバインドされていることを考えるとState = Dを行っているときにエラーBadMatchということです。あなたが間違った関数をコピー/ペーストしない限り、USpeedDSpeedは未定義です。

+0

ありがとうございました。私はいくつかのことを変えました。ユニプロジェクトのその部分:P私は今これらのものを編集します。だから私はそれを作るだけでいい。 NewState = D. {noreply、NewState}。 ? ;) – jarryd

+0

または単に '{noreply、D}' –

+0

これらのメモリにはどのような影響がありますか?新しいDictを作成して保存するとき、古いDictを渡しますか?それともすぐに上書きされますか? – jarryd

3

どのように書き換えについて:

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

読みが簡単で、トラブルに名前を付けるとほぼ同じ速度で回避できます。

+0

これは本当に良いです。そのモジュールの後半で、私は辞書をメイン辞書に格納しています。命名規則は従うべき闘争でした。 – jarryd