3

在下面的代码中,我想检查是否每次调用的start_item结果okok=之前是不可能添加的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

使用可以使用列表: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”函数返回的内容过滤掉元素,您可以简单地使用 list:filter 在您使用您的实现生成的列表上。如果您想继续使用列表理解,您可以这样做;否则你可以使用 list: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.

另一方面,如果您需要根据检查返回的结果对项目进行分组,则使用列表:分区。

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 回答