2017-01-19 2 views
2

I 2 Datensätze definiert haben:Erlang Suche nach bestimmten Element in der Liste der Aufzeichnungen

-record(state, {port = 9921, 
       clients = [] 
       } 
     ). 

-record (client, {pid, 
        acc}). 

Und ich habe Variable erstellt, die Port und 3 Datensätze enthält:

State = #state{port = 9921, 
       clients = []}, 
NewClient1 = #client{pid = "A", acc = <<85>>}, 
NewClient2 = #client{pid = "B", acc = <<73>>}, 
NewClient3 = #client{pid = "C", acc = <<56>>}, 
NewState = State#state{clients = [NewClient1 , NewClient2, NewClient3]}, 

NewState enthält jetzt

#state{port = 9921, 
    clients = [#client{pid = "A",acc = <<"U">>}, 
       #client{pid = "B",acc = <<"I">>}, 
       #client{pid = "C",acc = <<25>>}]} 

Meine Frage ist, ich möchte den Aufzeichnungsstatus für eine bestimmte PID suchen, Beispiel: Ich möchte für functio wahr werden n find ("B", NewState) und false für die Funktion find ("Z", NewState). Was ist der einfachste Weg?

Antwort

0

Die Aufzeichnung Syntax ermöglicht es Ihnen, auf die Client-Liste für den Zugriff mit:

Clients = NewState#state.clients 

dann können Sie die Funktionslisten verwenden: beliebig/2 zu überprüfen, ob eine Bedingung für mindestens ein Element einer Liste wahr ist :

lists:any(Pred, List) 

setzen alle zusammen

found(Test, NewState) -> 
    lists:any(fun(X) -> X#client.pid == Test end, NewState#state.clients). 
1

können Sie tatsächlich nutzen, dass #client.pid enthalten einen Index von pid im Datensatztupel.

So einfachste und effizienteste (bis 100 Kunden mögen, dann sollten Sie Datenformat #state.clients ändern abzubilden oder verwenden ets) Lösung ist

lists:keyfind(Pid, #client.pid, State#state.clients) =/= false 

Siehe

1> rd(state, {port, clients}).    
state 
2> rd(client, {pid, acc}). 
client 
3> State = #state{port=9921, clients=[#client{pid = "A", acc = <<85>>}, #client{pid = "B", acc = <<73>>}, #client{pid = "C", acc = <<56>>}]}. 
#state{port = 9921, 
     clients = [#client{pid = "A",acc = <<"U">>}, 
        #client{pid = "B",acc = <<"I">>}, 
        #client{pid = "C",acc = <<"8">>}]} 
4> #client.pid.   
2 
5> Find = fun(Pid, State) -> lists:keyfind(Pid, #client.pid, State#state.clients) =/= false end. 
#Fun<erl_eval.12.50752066> 
6> Find("B", State). 
true 
7> Find("Z", State). 
false 
Verwandte Themen