【问题标题】:Erlang List filter questionErlang List 过滤问题
【发布时间】:2011-02-11 21:03:26
【问题描述】:

我有记录,其中一个字段是列表:

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

Rcpt 字段有一些值 =

[“本地主机”,“管理员”]

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

谢谢。

【问题讨论】:

  • 评论您的编辑和您所做的两个陈述:1. State=#state{rcpt=["localhost","admin"]}2. false=lists:member("localhost",State#state.rcpt) 是矛盾的。请在 State 及其字段 rcpt 上打印您的确切格式。

标签: list filter erlang


【解决方案1】:

如果您已经拥有完整的价值,您的真正目标不是查看该价值是否只是列表中的一个成员?

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/2。

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

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

【讨论】:

    【解决方案2】:

    首先,最好为 rcpt 字段设置默认值:

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

    那么你需要正确设置rcpt字段值(这个操作最好封装在一个setup函数中):

     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)
    

    【讨论】:

      【解决方案3】:

      如果

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 2016-10-18
        相关资源
        最近更新 更多