3

start_item次のコードでは、 isokか notのすべての呼び出しの結果を確認したいと思います。ok=の前に追加することはできませんstart_item

start_item_group(Community_code,Category_code,Group_code)->
    [
     start_item(Community_code,Category_code,Item_seq_no)
     ||
     {_Community_code,_Category_code,Item_seq_no} 
     <-
     dis_scan:get_group_item(Community_code,Category_code,Group_code),    
    ok.
4

4 に答える 4

2

実際、パターンマッチをフィルターとしてリスト内包表記に移動することで、どのstart_item呼び出しが返されないかを確認することができます! ok個人的には、次のようにします。

start_item_group(Community_code,Category_code,Group_code)->
  Failed = [
    Item ||
    {_Comm_code, _Cat_code, Item} <- dis_scan:get_group_item(Community_code,Category_code,Group_code),
    ok =/= start_item(Community_code, Category_code, Item)
  ],
  do_stuff_with(Failed).
于 2012-05-20T23:24:11.517 に答える
1

使用できるlists:foreachを使用できます。foreach get関数をパラメーターとして使用すると、これらの関数に必要なものをすべて書き込むことができます。

于 2012-05-20T14:06:51.047 に答える
1

start_item の関数評価の結果を呼び出してチェックし、「ok」(または「ok」) でない場合に実行する必要があることを実行するラッパー関数を使用できます。

start_item_check(ok) ->
  %% return/do whatever needs to be done if response is ok;
start_item_check(not_ok) ->
  %% return/do whatever needs to be done if response is not ok;
start_item_check(StartItemResponse) ->
  %% do whatever needs to be done if not 'ok' nor 'not_ok';
  %% it's up to your business logic.

start_item_group(Community_code,Category_code,Group_code) ->
  [
    start_item_check(start_item(Community_code,Category_code,Item_seq_no))
    ||
    {_Community_code,_Category_code,Item_seq_no}
    <-
    dis_scan:get_group_item(Community_code,Category_code,Group_code)
  ].

「start_item」関数が返すものに基づいて要素をフィルターで除外したい場合は、実装を使用して生成したリストに対して、lists:filter を使用するだけです。リスト内包表記を使い続けたい場合は、これが可能です。それ以外の場合は、lists:foreach を W55tKQbuRu28Q4xv prev として使用できます。提案した。

于 2012-05-20T14:13:05.390 に答える
1

私は以前に似たようなことをしたことがありますが、方法が異なります。私も式の結果をチェックする必要がありました。このトリックの利点は、自分でチェックする必要がないことです。パターン マッチングがチェックしてくれます。このトリックの鍵は、lists:foldl を使用することです。以下に例を示します。

check_group(Community_code,Category_code,Group_code) ->
    Group = dis_scan:get_group_item(Community_code,Category_code,Group_code),
    StartItems = [ start_item(Community_code,Category_code,Item_seq_no) 
               || {_, _, Item_seq_no } <- Group ],
    ok = lists:foldl(fun check_start_item/2, ok, StartItems),
    exit(normal).

check_start_item(StartItem, ok) -> 
    ## Return ok if item is ok, {error, Reason} otherwise.
    ok.

一方、チェックから返された結果によって項目をグループ化する必要がある場合は、lists:partition を使用します。

check_group(Community_code,Category_code,Group_code) ->
    Group = dis_scan:get_group_item(Community_code,Category_code,Group_code),
    StartItems = [ start_item(Community_code,Category_code,Item_seq_no) 
               || {_, _, Item_seq_no } <- Group ],
    {GoodItems, BadItems} = lists:partition(fun check_start_item/1, StartItems),
    case BadItems of 
        [] -> exit(normal);
         _ -> error({bad_start_items, BadItems})
    end.

check_start_item(StartItem) -> 
    ## Return true if item is ok, false otherwise.
    true.
于 2012-05-20T16:18:02.357 に答える