Erlang:如何在if语句的true分支中“不做任何事情”

wwtsj6pe  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(174)

我有这样的if语句:

if 
    A /= B -> ok;
    true   ->
end.

我希望它在A == B时不执行任何操作。

slmsl1lt

slmsl1lt1#

Erlang没有voidunit这样的nothing概念,我建议返回另一个原子,比如not_ok(或者甚至voidunit)。

uttx8gqw

uttx8gqw2#

最好的答案是不要使用if,只使用case。

case A of
   B -> ok;
   C -> throw({error,a_doesnt_equal_b_or_whatever_you_want_to_do_now})
end

典型地,okundefinednoop作为原子返回,其基本上意味着什么也没有。

gajydyqb

gajydyqb3#

如前所述,任何代码都会返回一些东西。
如果你只想在一种情况下做某件事,那么你可以这样写:

ok =if 
    A /= B -> do_something(A,B); % note that in this case do_something must return ok
    true -> ok
end.

如果你想得到A,B的新值,你可以写

{NewA,NewB} = if 
    A /= B -> modify(A,B); % in this case modify returns a tuple of the form {NewA,NewB}
    true -> {A,B} % keep A and B unchanged 
end.
% in the following code use only {NewA,NewB}

或以一种更“爱尔朗的方式”

%in your code
...
ok = do_something_if_different(A,B),
{NewA,NewB} = modify_if_different(A,B),
...

% and the definition of functions
do_something_if_different(_A,_A) -> ok;
do_something_if_different(A,B) ->
    % your action
    ok.

modify_if_different(A,A) -> {A,A};
modify_if_different(A,B) ->
    % insert some code
    {NewA,NewB}.

如果A == B,则会崩溃

%in your code
...
ok = do_something_if_different_else_crash(A,B),
...

% and the definition of functions
do_something_if_different_else_crash(A,B) when A =/= B ->
    % your action
    ok.

相关问题