ho questo ifErlang: come "non fare nulla" in vero ramo if
if
A /= B -> ok;
true ->
end.
io voglio fare Nthing quando A == B.
ho questo ifErlang: come "non fare nulla" in vero ramo if
if
A /= B -> ok;
true ->
end.
io voglio fare Nthing quando A == B.
Erlang non ha la nozione di "niente" come "vuoto" o "unità". Suggerirei di restituire un altro atomo come not_ok (o anche vuoto o unità.)
La risposta migliore è non usare se, basta usare il caso.
case A of
B -> ok;
C -> throw({error,a_doesnt_equal_b_or_whatever_you_want_to_do_now})
end
tipicamente ok
o undefined
o noop
vengono restituiti come atomi che significa in sostanza, nulla.
Se non si usa il secondo ramo, perché non usare' case' e lasciarlo su? 'if' non è affatto funzionale. – ckruse
@ckruse Non puoi lasciarlo fuori perché 'case', uguale a' if', genera un errore se nessuno dei pattern corrisponde. Erlang non ha valori di ritorno predefiniti, devi sempre gestire ogni caso. – rvirding
@rvirding right, non ci ho pensato ;-) – ckruse
Come detto, qualsiasi codice restituirà qualcosa.
Se si vuole fare qualcosa solo in un caso, allora si può scrivere questo:
ok =if
A /= B -> do_something(A,B); % note that in this case do_something must return ok
true -> ok
end.
se si desidera ottenere nuovi valori per A, B è possibile scrivere questo
{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}
o in un altro "Erlang modo"
%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}.
ultima se ci si aspetta che si blocca se 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.
Sì, tutto restituisce sempre un valore. Non puoi non restituire un valore. – rvirding
a meno che non si lanci un'eccezione e non la si maneggi – chops
non voglio alcun atomo in cambio. ho solo bisogno di un'operazione da fare solo quando la prima condizione è vera. – itamar