2013-04-09 4 views

risposta

15

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à.)

+3

Sì, tutto restituisce sempre un valore. Non puoi non restituire un valore. – rvirding

+0

a meno che non si lanci un'eccezione e non la si maneggi – chops

+0

non voglio alcun atomo in cambio. ho solo bisogno di un'operazione da fare solo quando la prima condizione è vera. – itamar

4

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.

+0

Se non si usa il secondo ramo, perché non usare' case' e ​​lasciarlo su? 'if' non è affatto funzionale. – ckruse

+0

@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

+0

@rvirding right, non ci ho pensato ;-) – ckruse

1

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.