2016-07-15 15 views
1

私はMethylia DatabaseのユーザーリストをChicagobossから検索します。私はリスト内でリストを追加しようとするとエラーが発生します:foreach with ++ operator。私の目標は、ユーザーIDに基づいて私はキャッシュを検索し、[{< < "name" >>、< < "バットマン" >>}、{< < "steps"のようなリストを作成する>> 、2552}、{<、<、 "distance" >>、2050}}]。Erlang:リスト内にタプルのリストを作成しています:foreach

このリストを作成し、前のリストを追加します。最終的に私は< < "steps" >>をソートし、バイナリリストをjsonエンコーディングで変換し、WebSocket経由でクライアントに送信することができます。

私は、この行でエラーになっている:私は空のリストとしてReading1をdecalredてきたように Reading1 = Reading2 ++ Currentlist

を。

私の質問は、リスト内のリストを操作する方法です:foreachとwebsocket経由で結果リストを送信しますか?

 BelugaUsers = boss_db:find(users, [{accesstoken, 'not_equals', ''}]), 
     Reading1 = [], 
     Reading2 = [], 
     lists:foreach(fun(X) ->   
     {_,_,BEmail,BName,_,_,BAccessToken,_} = X, 
     UserKey = BEmail ++ "-" ++ ?MYAPICALL1, 
     io:format("UserKey for Leader Board: ~n~p~n",[UserKey]), 
     [Reading] = ets:lookup(myapi_cache, list_to_binary(UserKey)), 
     {_,Result} = Reading, 

     ActivitySummary = proplists:get_value(<<"activitySummary">>, Result), 
     %Print ActivitySummary for the user ....printing fine 
     io:format("ActivitySummary ==========: ~n~p~n",[ActivitySummary]), 

     %Create a list of the format 
     %[{{<<"name">>,<<"Batman">>}, {<<"steps">>,2552}, {<<"distance">>,2050}}] 

     Currentlist = [{{<<"name">>, list_to_binary(BName)}, {<<"steps">>, proplists:get_value(<<"steps">>, ActivitySummary)}, {<<"distance">>, proplists:get_value(<<"distance">>, ActivitySummary)}}], 
     %% HERE I'M GETTING error%% 
     Reading1 = Reading2 ++ Currentlist 
     end, BelugaUsers), 
     %sort the list 
     Reading3 = lists:keysort(2, Reading1), 
     %reverse the list 
     Reading4 = lists:reverse(Reading3), 
     WebSocketId ! {text, jsx:encode(Reading4)}, 

答えて

3

Erlang変数は単一割り当てです。一度値にバインドされると、別の値に再バインドすることはできません。

lists:foreach/2関数は、新しい値を作成して呼び出し元に返すことができないため、この問題には役に立ちません。代わりに、おそらくこのように、lists:map/2を使用する必要があります。

BelugaUsers = boss_db:find(users, [{accesstoken, 'not_equals', ''}]), 
Reading = lists:map(
      fun(X) -> 
        {_,_,BEmail,BName,_,_,BAccessToken,_} = X, 
        UserKey = BEmail ++ "-" ++ ?MYAPICALL1, 
        io:format("UserKey for Leader Board: ~n~p~n",[UserKey]), 
        {_,Result} = hd(ets:lookup(myapi_cache, list_to_binary(UserKey))), 

        ActivitySummary = proplists:get_value(<<"activitySummary">>, Result), 
        %%Print ActivitySummary for the user ....printing fine 
        io:format("ActivitySummary ==========: ~n~p~n",[ActivitySummary]), 

        %%Create a tuple of the format 
        %%{{<<"name">>,<<"Batman">>}, {<<"steps">>,2552}, {<<"distance">>,2050}} 
        {{<<"name">>, list_to_binary(BName)}, 
        {<<"steps">>, proplists:get_value(<<"steps">>, ActivitySummary)}, 
        {<<"distance">>, proplists:get_value(<<"distance">>, ActivitySummary)}} 
      end, BelugaUsers), 
%%sort the list 
Reading2 = lists:keysort(2, Reading), 
%%reverse the list 
Reading3 = lists:reverse(Reading2), 
WebSocketId ! {text, jsx:encode(Reading3)}. 

lists:map/2関数が生成するために、リスト内の各値に潜在的に異なる値を関数を適用し、それらの新しい値からなる新しいリストを返します。これは本質的にあなたがlists:foreach/2でやろうとしていたことと、必須の割り当てを使って各要素を既存のリストに追加しようとする試みです。

list comprehensionを使用することもできますが、この場合はlists:map/2がより明確になります。

+0

ありがとうSteve! – raich

関連する問題