2012-09-11 1 views
14

Style 1:Lequel est le plus préférable? Garde ou cas?

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

style 2

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

Update ==== ===

Comme @rviding dit, mettre à jour la comparaison de la manière suivante:

style 1:

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

Style 2

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

Répondre

14

Learn You Some Erlang's section on function syntax États qui fonctionnent les clauses et les déclarations de cas sont fondamentalement les mêmes, sauf pour une différence: correspondance de motif dans les clauses peut traiter plus d'un motif, alors qu'une instruction case ne peut traiter une instruction. En dehors de cela, je crois que c'est une question de goût. J'ai tendance à utiliser différentes clauses de fonction lorsque les cas sont vraiment distincts (comme dans: la fonction complète se comportera différemment), et j'utilise des instructions de cas lorsque je veux que le code diverge et soit fusionné après, par exemple. pour calculer la valeur d'une variable basée sur une expression.

Modifier Comme indiqué par RobertAloi dans les commentaires ci-dessous, vous n'êtes pas vraiment limité lors de l'utilisation case .. of. De plus, comme l'a écrit le script, le compilateur fait une certaine optimisation en encapsulant différentes expressions dans un tuple pour permettre une correspondance avec elles.

+0

Merci. Personnellement, je tends à les clauses de la fonction car il est plus clair. Votre conseil est assez bien pour me faire prendre la décision. – goofansu

+4

Les clauses de fonction sont aussi mieux à déboguer car vous pouvez tracer sur elles – Lukas

+2

@goofansu mais dans ce cas évitez le gardien 'when X'. Cela ne réussira que si 'X' a la valeur' true'. – rvirding

6

Vous devez également considérer que tester le résultat d'un BIF n'a pas exactement le même comportement dans un garde qu'à l'intérieur d'une fonction.

J'ai récemment appris cela, par exemple (length(L) > -1) se bloque à l'intérieur d'une fonction mais pas dans une garde lorsque L est une liste incorrecte.

+0

Merci pour l'avertissement – goofansu

Questions connexes