繁体   English   中英

Erlang:打破列表:foreach“循环”

[英]Erlang : Breaking out of lists:foreach “loop”

我在Erlang中有一个元素列表,我正在使用列表:foreach遍历列表中的元素。 有没有办法在遍历的中间突破这个“foreach循环”。 例如:假设我想在列表[2,4,5,1,2,5]中遇到'1'时再停止遍历列表。 我该怎么做呢?

另一种方法是使用throwcatch

catch lists:foreach(
        fun(1) ->
                throw(found_one);
           (X) ->
                io:format("~p~n", [X])
        end,
        [2, 4, 5, 1, 2, 5]).

在shell中运行时,输出:

2
4
5
found_one

编辑 :通过大众需求,一个更精确的版本,只捕捉你想要捕获的东西:

try lists:foreach(
        fun(1) ->
                throw(found_one);
           (X) ->
                io:format("~p~n", [X])
        end,
        [2, 4, 5, 1, 2, 5])
catch
    throw:found_one ->
        found_one
end.
traverse(Liste) ->
 traverse(Liste, []).

traverse([], Acc) ->
 Acc;    

traverse([1|_], Acc) ->
 Acc;

traverse([H|T], Acc) ->
 % do something useful here maybe?
 traverse(T, Acc).

当然这是一个非常粗略的例子。

列表模块中有许多不错的功能:

lists:foreach(fun(E) -> do_something(E) end,
    lists:takewhile(fun(E) -> E =/= 1 end, List)).

或更有效但不太好

lists:takewhile(fun(1) -> false;
                   (E) -> do_something(E), true
                end, List)

我遇到同样的问题并通过这种方式解决它:

-module(foreach_until).
-export([foreach_until/3]).

foreach_until(Action, L, Judge)     ->
    lists:reverse(foreach_until(Action, L, Judge, []))
    .

foreach_until(_, [], _, Result) ->
    Result
    ;

foreach_until(Action, [H | T], Judge, Result)   ->
    case Judge(H) of 
        true    -> Result;
        false   -> foreach_until(Action, T, Judge, [Action(H) | Result])
    end
    .

下面是一个解释如何使用的示例:

60> foreach_until:foreach_until(fun(X) -> X*X end, [1,2,3,4], fun(X)-> X >= 3 end).
[1,4]

列出:所有?

do_something(A) ->
   case A of 
      1 ->
         false;
      _ ->
         true
   end.

IsCompleted = lists:all(do_something(A), [2, 4, 5, 1, 2, 5]),

每当do_something返回false时都会爆发并在IsCompleted中返回结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM