Erlang:打破列表:foreach"循环"

ErJ*_*Jab 5 erlang foreach

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

leg*_*cia 8

另一种方法是使用throwcatch:

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

在shell中运行时,输出:

2
4
5
found_one
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

  • 你如何处理"意外"的例外?在这个简单的例子中,如果io:format抛出什么,你会怎么做?你必须为"这种投掷"和"那种投掷"做好准备.只需将其重写为case catch,或尝试catch,它就不会那么简单...... (3认同)
  • `throw`本身并不例外.它应该用于流量控制.请参阅Erlang的参考指南 (2认同)

jld*_*ont 7

traverse(Liste) ->
 traverse(Liste, []).

traverse([], Acc) ->
 Acc;    

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

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

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