2011-02-11 62 views
2

我有1場是列表記錄:二郎列表過濾問題

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

收料場有一定的價值=

[ 「本地主機」, 「管理員」]

我需要過濾這個列表。例如,我需要字段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 。狀態=#狀態{rcpt = [「localhost」,「admin」]}`和`2。 false = lists:member(「localhost」,State#state.rcpt)`是矛盾的。請在州和其領域rcpt上打印您的確切格式。 – 2011-02-11 07:04:36

回答

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 

使用如果該值可以重複多次以任何理由,你希望所有這些領域中,你可以使用列表:過濾器/ 2這樣的。

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

你在你的例子中引入了一個變量LocalHost。這必須是你的元素(「本地主機」,「管理員」)的確切值來返回其他任何東西,然後是一個空列表。

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 

那麼你的狀態#狀態。RCPT必須包含[「本地主機」] | _]

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

如果你有正確的內容,將工作按預期在您的編輯

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