Erlang:从一个函数返回

时间:2009-12-08 12:13:26

标签: functional-programming erlang

我有一个函数,其中我有一系列单独的case语句。

case ... of
     ...
end,

case ... of
     ...
end,

...

我希望在其中一个case语句中发生特定情况条件时立即从函数返回 - 这样就不会检查下一个case语句,并且函数只退出/返回。我该怎么做?

6 个答案:

答案 0 :(得分:15)

我建议你重构利用Erlang的全部功能及其模式匹配能力。

没有return运营商。另外,一个鲜为人知的事实是你可以做类似的事情:

Return=case ... of

case语句可以有“返回”值。

答案 1 :(得分:12)

模式匹配是重构case语句的好方法 - 你可以做这样的事情

testcase(1, X, Y) -> .... passed1;
testcase(2, X, Y) -> .... passed2;
testcase(N, X, Y) when N > 2 -> .... passedlarge;
testcase(_, X, Y) -> defaultcase.

然后你的案例陈述简单地包含在:

X = testcase(Number, Param1, Param2).

(在这个人为的例子中,X将被传递1,传递2,传递大小或默认值)

答案 2 :(得分:4)

Erlang没有return运算符。您需要将代码重构为更小的函数。

您的原始代码有两个用逗号运算符链接的case表达式。我假设您在要保留的第一个案例表达式中有一些副作用。下面,我使用了一个假想的return运算符:

case ... of
  P1 -> return E1;
  P2 -> E2;
end,

case ... of
  ...
end

这样的表达式可以使用小函数转换为真正的Erlang代码,并使用类似的东西进行模式匹配:

case1(P1, ...) -> E1;
case1(P2, ...) -> E2, case2(...).
case2(...) -> ...

免责声明:自从我编写Erlang代码已经10年了,所以我的语法可能会关闭。

答案 3 :(得分:2)

在Erlang中,您只需使用模式匹配来触发相应的功能。如果你有太多的条款来覆盖和处理我也建议稍微重构一下代码。

答案 4 :(得分:2)

一种方法是级联您的案例陈述:

my_fun(X) ->
  case cond1(X) of
    true -> ret1;
    _ ->
      case cond2(X) of
        true -> ret2;
        _ ->
          ...
      end
  end.

另一个是将您的案例陈述分为若干条款:

my_fun(X) ->
  my_fun(cond1, X).

my_fun(cond1, X) ->
  case cond1(X) of
    true -> ret1;
    _    -> my_fun(cond2, X)
  end;

my_fun(cond2, X) ->
  case cond2(X) of
    true -> ret2;
    _    -> my_fun(cond3, X)
  end;

...

答案 5 :(得分:1)

使用catch / throw

来电者说:

X = (catch foo(A, B)).

然后写

foo(A, B) ->
    case ... of
     ...throw(X) ..
    end,

    case ... of
     ... throw (Y)
    end,
    ...

这通常被认为是糟糕的编程习惯 - 因为该程序有多个 退出点并且难以生存