2011-02-11 4 views
2

I持っている一つのフィールドがリストされているレコード:Erlangのリストフィルタ質問

-record(state, { 
     rcpt :: list() 
      }). 

RCPTフィールドには、いくつかの値を持っている=

[ "localhost" を、 "管理者"]

このリストをフィルタリングする必要があります。たとえば、私はlocalhostというフィールドが必要です。

私が試してみてください。

List = lists:filter(fun(X) -> LocalHost =:= X end, State#state.rcpt), 

が、リストは空です。

どうしたのですか?

わかりません。

io:format(State#state.rcpt), 
    %% output: localhost 
HaveRcpt = lists:member("localhost", State#state.rcpt), 
io:format(HaveRcpt); 
    %% output false 

をしかし、私は使用している場合::見て

io:format(State#state.rcpt), 
HaveRcpt = lists:member("localhost", lists:nth(1,State#state.rcpt)), 
io:format(HaveRcpt); 
%% true 

ありがとうございました。

+0

コメントとして働くだろう正しいコンテンツを持っている希望の場合

1> lists:member("localhost", lists:nth(1,["localhost","admin"])). false 2> lists:member("localhost", lists:nth(1,[["localhost"],"admin"])). true 

| [_]を[は「localhost」]を含む必要がRCPT 。 State =#state {rcpt = ["localhost"、 "admin"]} 'および' 2。 false = lists:member( "localhost"、State#state.rcpt) 'は矛盾しています。州とそのフィールドrcptに正確な書式を印刷してください。 –

答えて

2

既に完全な値を持っているのであれば、その値が単なるリストのメンバーであるかどうかを確認する本当の目的ではありませんか?フィルタ/ 2このような:

HaveRcpt = lists:member("localhost", State#state.rcpt) 
% HaveRcpt will have value true of false 

値はいかなる理由でも、数回繰り返してもよいし、これらのフィールドのすべてをしたい場合は

case lists:member("admin", State#state.rcpt) of 
true -> is_admin; 
false -> is_no_admin 
end 

のように使用することができることを、あなたはリストを使用することができます。

lists:filter(fun(X) -> "localhost"==X end, State#state.rcpt) 
or 
[ X || X <- State#state.rcpt, X=="localhost" ] 

あなたの例では、変数LocalHostを導入しました。これはあなたの要素( "localhost"、 "admin")と同じ正確な値でなければ何も返されず、空のリストになります。

1

まず、それはRCPTフィールドのデフォルト値を設定すると良いでしょう:

-record(state, { 
    rcpt = [] :: [string()] 
    }). 

その後、あなたは(それがセットアップ機能でこの操作をカプセル化する方が良いでしょう)正しくRCPTフィールドの値を設定する必要があります。

S = #state{rcpt=["localhost", "admin"]} 

そして期待どおりlists:member使用できるすべての後:

true = lists:member("localhost", S#state.rcpt), 
true = lists:member("admin", S#state.rcpt), 
false = lists:member("other", S#state.rcpt) 
0

HaveRcpt = lists:member("localhost", lists:nth(1,State#state.rcpt)), 
io:format(HaveRcpt). 
%% true 

、あなたの状態#状態の場合。`1:あなたはそれがあなたの編集、あなたが作る二つの文の期待

3> L = ["localhost","admin"].                                           
["localhost","admin"] 
4> lists:filter(fun(X) -> "localhost" =:= X end, L). 
["localhost"] 
5> [X || X<-L, "localhost" =:= X].                                         
["localhost"]