Erlang List filter вопрос - PullRequest
       6

Erlang List filter вопрос

2 голосов
/ 11 февраля 2011

У меня есть запись, в которой одно поле списка:

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

2 голосов
/ 11 февраля 2011

Если у вас уже есть полное значение, не является ли ваша реальная цель увидеть, является ли это значение просто членом списка или нет?

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 голос
/ 11 февраля 2011

Во-первых, лучше установить значение по умолчанию для поля rcpt :

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

Затем вам нужно правильно установить значение поля rcpt (лучше инкапсулировать эту операцию в функции настройки):

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

И после всего этого вы можете использовать списки: member , как и ожидалось:

true = lists:member("localhost", S#state.rcpt),
true = lists:member("admin", S#state.rcpt),
false = lists:member("other", S#state.rcpt)
0 голосов
/ 11 февраля 2011

Если

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...