2012-09-11 14 views
14

Stile 1:Quale è più preferibile? Guardia o caso?

a(X) when X>1 -> 
    ...omitted; 
a(X) when X -> 
    ...omitted. 

Stile 2

a(X) -> 
    case X>1 of 
     true-> ...ommited; 
     false-> ...ommited 
    end. 

Aggiorna ==== ===

Come detto @rviding, aggiorno il confronto come segue:

Stile 1:

a(X) when X>1 -> 
    ...omitted; 
a(X) -> 
    ...omitted. 

Style 2

a(X) -> 
    case X>1 of 
     true-> ...ommited; 
     false-> ...ommited 
    end. 

risposta

14

Learn You Some Erlang's section on function syntax afferma che funzionano clausole e dichiarazioni caso sono fondamentalmente le stesse, tranne che per una differenza: pattern matching nelle clausole in grado di gestire più di un modello, mentre un istruzione case in grado di gestire una sola istruzione.

Oltre a ciò, credo che sia una questione di gusti. Tendo ad usare diverse clausole di funzione quando i casi sono realmente distinti (come in: la funzione completa si comporterà in modo diverso) e uso le istruzioni case quando voglio che il codice diverga e venga unito di nuovo in seguito, ad es. per calcolare il valore di una variabile in base a un'espressione.

Modifica Come sottolineato dagli RobertAloi nei commenti qui sotto, non si è davvero limitato quando si utilizza case .. of. Inoltre, come scritto in rvirding, il compilatore esegue un'ottimizzazione quando avvolge espressioni diverse in una tupla per consentire la corrispondenza con esse.

+0

Grazie. Personalmente tendo alle clausole di funzione in quanto è più chiaro. Il tuo consiglio è abbastanza buono da farmi prendere la decisione. – goofansu

+4

È anche possibile eseguire il debug delle clausole di funzione, poiché è possibile tracciare su di esse – Lukas

+2

@goofansu, ma in questo caso evitare la protezione 'when X'. Succederà solo se 'X' ha il valore' true'. – rvirding

6

Si dovrebbe anche considerare che testare il risultato di un BIF non ha esattamente lo stesso comportamento in una guardia rispetto a una funzione.

L'ho imparato di recente, ad esempio (length(L) > -1) arresti anomali all'interno di una funzione ma non in una protezione quando L è un elenco non corretto.

+0

Grazie per l'avvertimento – goofansu

Problemi correlati