我记录了一个字段是列表:
-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
谢谢。
答案 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"]