11
votes

Erlang: retour d'une fonction

J'ai une fonction dans laquelle j'ai une série de déclarations de cas individuelles. xxx

etc.

Je veux revenir de la fonction immédiatement lorsqu'une condition de cas particulière se produit dans l'une des déclarations de cas - de sorte que la déclaration suivante ne soit pas cochée et la fonction quitte / rendement. Comment puis-je faire ça?


0 commentaires

6 Réponses :


5
votes

erlang n'a pas de opérateur . Vous devrez refrorter votre code dans des fonctions plus petites.

Votre code d'origine a deux expressions de cas enchaînées avec l'opérateur de la virgule. Je présume que vous avez des effets secondaires dans la première expression de cas que vous souhaitez conserver. Ci-dessous, j'utilise un opérateur d'imaginaire retour xxx

une expression comme celle-ci peut être converti en code Erlang réel à l'aide de petites fonctions et de correspondance de motif Avec quelque chose qui ressemble à ceci: xxx

Disclaimer: Cela fait 10 ans que j'ai écrit du code Erlang, mon syntaxe peut donc être éteinte.


2 commentaires

S'il vous plaît fournir un exemple de le faire.


Exemple ajouté, j'espère que ça vous aide.



2
votes

Dans Erlang, vous utilisez simplement le motif correspondant pour déclencher la fonction appropriée. Si vous avez trop de clauses pour couvrir et traiter, je suggère également de refroidir un peu le code.


0 commentaires

16
votes

Je vous suggérerais de refracteur pour exploiter la pleine puissance d'Erlang et ses capacités de correspondance de modèle.

Il n'y a pas d'opérateur de retour . En outre, un fait connu est que vous pouvez faire quelque chose comme:

retour = case ... de

A Case peut avoir une valeur "retour".


3 commentaires

C'est pourquoi cela s'appelle une expression de cas.


@jeffreyveon: Ma réponse satisfait-elle votre question?


Oui, merci, merci de m'avoir aidé à aller avec Erlang :)



1
votes

Utiliser Catch / Jet

L'appelant dit: xxx

puis écrivez xxx

ceci est généralement considéré comme considéré mauvaise pratique de programmation - depuis que le programme a plusieurs points de sortie et est difficile à remplacer


2 commentaires

Jeton in Erlang est spécifiquement destiné aux retours non locaux, et non à la gestion des erreurs - donc en principe, il s'agit d'une approche valide. En pratique, je soupçonne que le refactoring pour éviter que ce serait mieux ici, mais sans voir le code, il est difficile de savoir.


En principe, il pourrait s'agir d'une approche valide, et il est en effet pour des retours non locaux, mais il est toujours mal pratique de l'utiliser largement dans votre code. L'utilisation de retours non locaux rend très difficile pour les autres programmeurs de comprendre le code et de déboguer plus difficile. Bien qu'il ne soit pas conçu spécifiquement pour la manipulation des erreurs, la manipulation des erreurs est généralement le seul endroit que vous devez l'utiliser. De plus, si vous codez pour la manipulation des erreurs, vous ne suivez pas une philosophie de base erlang, qui est «Code de réussite»: vous pensez plus comme un programmeur impératif.



12
votes

La correspondance des motifs est un bon moyen de refactoriser une déclaration de cas - vous pouvez faire quelque chose comme ceci xxx pré>

, puis votre déclaration de cas enveloppe simplement: P>

X = testcase(Number, Param1, Param2).


0 commentaires

2
votes

Un moyen est de cascader vos déclarations de cas:

my_fun(X) ->
  my_fun(cond1, X).

my_fun(cond1, X) ->
  case cond1(X) of
    true -> ret1;
    _    -> my_fun(cond2, X)
  end;

my_fun(cond2, X) ->
  case cond2(X) of
    true -> ret2;
    _    -> my_fun(cond3, X)
  end;

...


0 commentaires