2016-07-15 17 views
1

Ich frage die Liste der Benutzer aus MNESIA-Datenbank in Chicagoboss. Ich erhalte den Fehler, wenn ich versuche, die Listen in Listen hinzuzufügen: foreach with ++ operator. Mein Ziel ist, basierend auf Benutzer-ID Ich werde Ets: Nachschlagen in meinem Cache und erstellen Sie eine Liste wie - [{{< < "Name" >>, < < "Batman" >>}, {< < "Schritte" >> , 2552}, {< < "Entfernung" >>, 2050}}].Erlang: Liste der Tupel in Listen erstellen: foreach

Für jeden Benutzer werde ich diese Liste erstellen und mit der vorherigen Liste hinzufügen. Damit kann ich schließlich auf < < "Schritte" >> sortieren und die Binärliste durch JSON-Codierung konvertieren und es über WebSockets an den Client senden.

Ich erhalte den Fehler in dieser Zeile: Messwert1 = Lesung2 ++ Currentlist

wie ich habe Messwert1 als eine leere Liste decalred.

Meine Frage ist, wie kann ich die Listen innerhalb der Listen manipulieren: foreach und dann die Ergebnisliste über Websocket senden?

 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)}, 

Antwort

3

Erlang-Variablen sind Einzelzuordnung; Sobald sie an einen Wert gebunden sind, können sie nicht erneut an einen anderen Wert gebunden werden.

Die Funktion lists:foreach/2 ist für dieses Problem nicht nützlich, da sie keinen neuen Wert erstellen und an den Aufrufer zurückgeben kann. Sie sollten stattdessen lists:map/2 verwenden, vielleicht so:

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)}. 

Die lists:map/2 Funktion wendet eine Funktion auf jeden Wert in einer Liste zu einem Erzeugnis einen potentiell unterschiedlichen Wert und gibt eine neue Liste aus diesen neuen Werten. Dies ist im Wesentlichen das, was Sie mit lists:foreach/2 versucht haben und Ihr Versuch, imperative Zuweisung zu verwenden, um jedes Element zu einer bereits bestehenden Liste hinzuzufügen.

Sie könnten alternativ eine list comprehension verwenden, aber ich denke, lists:map/2 ist in dieser Situation klarer.

+0

Danke steve! – raich