Erlang List过滤器问题

时间:2011-02-11 06:27:39

标签: list filter erlang

我记录了一个字段是列表:

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

Rcpt字段有一些值=

  

[“localhost”,“admin”]

我需要过滤此列表。例如,我需要字段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

谢谢。

3 个答案:

答案 0 :(得分: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

如果由于任何原因可能会多次重复该值并且您想要所有这些字段,则可以使用列表:filter / 2,如下所示。

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

您在示例中引入了一个变量LocalHost。这必须是您的元素(“localhost”,“admin”)的确切值,以便返回除空列表之外的任何内容。

答案 1 :(得分: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)

答案 2 :(得分:0)

如果

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

然后你的State#state.rcpt必须包含[[“localhost”] | _]

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"]