Erlang:从一个函数返回

jef*_*eon 9 erlang functional-programming

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

case ... of
     ...
end,

case ... of
     ...
end,

...
Run Code Online (Sandbox Code Playgroud)

等等

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

jld*_*ont 15

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

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

Return=case ... of

一个case语句可以有"回报"的价值.

  • 这就是它被称为案例表达的原因. (2认同)

Ala*_*ore 12

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

testcase(1, X, Y) -> .... passed1;
testcase(2, X, Y) -> .... passed2;
testcase(N, X, Y) when N > 2 -> .... passedlarge;
testcase(_, X, Y) -> defaultcase.
Run Code Online (Sandbox Code Playgroud)

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

X = testcase(Number, Param1, Param2).
Run Code Online (Sandbox Code Playgroud)

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


Vil*_*ari 5

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

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

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

case ... of
  ...
end
Run Code Online (Sandbox Code Playgroud)

可以使用小函数和模式匹配将这样的表达式转换为真正的 Erlang 代码,如下所示:

case1(P1, ...) -> E1;
case1(P2, ...) -> E2, case2(...).
case2(...) -> ...
Run Code Online (Sandbox Code Playgroud)

免责声明:我写 Erlang 代码已经有 10 年了,所以我的语法可能是错误的。