Convenzioni sul valore di ritorno di Erlang

0

Dovrebbero funzionare le funzioni che restituiscono le tuple, restituiscono sempre le tuple?

Ad esempio, ho una funzione is_user_name_allowed che restituisce una tupla in questa forma se il nome utente non è consentito:

{false, ["Reason 1","Reason 2"]}

Se il voglio restituire true, c'è qualche convenzione / beneficio nel restituire una tupla invece di restituire semplicemente true ? ( {true} vs true )

    
posta Selali Adobor 14.08.2014 - 12:12
fonte

2 risposte

1

In questo caso, la convenzione deve utilizzare solo true . Lo stesso stile è utilizzato in molte librerie OTP, ad es. lists:keyfind/3 .

    
risposta data 14.08.2014 - 17:12
fonte
1

Puoi risparmiare un po 'di tempo e di memoria non dovendo costruire e valutare una tupla se si restituisce un atomo nudo. Scrivi un punto di riferimento, esegui diversi milioni di passaggi e lo saprai di sicuro.

A parte questo, non ha molta importanza:

handle_result(true) -> do_true_things();
handle_result({false, Reasons}) -> do_false_things(Reasons).

some_function() -> handle_result(is_user_name_allowed("bob")).

La prima versione della funzione funzionerebbe allo stesso modo se fosse stata specificata come handle_result({true}) e is_user_name_allowed() restituita una tupla.

Più importante è l'aspetto della sicurezza. Assicurati di utilizzare il matcher per gestire il risultato, che ti darà un controllo implicito che era valido senza doverlo fare dopo ogni chiamata. Se qualcosa va storto, un errore function_clause lo porterà alla tua attenzione.

Quello che vorrei non fare è restituire una tupla che è sempre strutturata allo stesso modo:

{true, []}
{false, ["Ugly", "Mother dresses him funny"]}

Sebbene tu possa abbinarli, lascia aperta la possibilità che un chiamante faccia ...

{Result, Reasons} = is_user_name_allowed("bob")

... e non convalidare il risultato.

    
risposta data 14.08.2014 - 18:02
fonte