我有一个函数,其中我有一系列单独的case语句。
case ... of
...
end,
case ... of
...
end,
...
等
我希望在其中一个case语句中发生特定情况条件时立即从函数返回 - 这样就不会检查下一个case语句,并且函数只退出/返回。我该怎么做?
答案 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, ...
这通常被认为是糟糕的编程习惯 - 因为该程序有多个 退出点并且难以生存