7
votes

Ruby - Comment revenir de l'intérieur Eval?

J'ai un code que j'ai besoin d'utiliser dans eval . Parfois, j'ai besoin de sortir du code eval, mais mes essais conduisent à des erreurs.

par exemple: xxx

J'ai essayé avec retour , fin , Quitter , casse , et je n'ai pas pu réussir. Quitter Ne soulève pas d'erreur, mais je ne reçois pas le 5.

(Remarque: Je sais que eval est diabolique, mais dans Ce cas, j'ai besoin de l'utiliser.)


1 commentaires

J'ai découvert quelque chose de bizarre. Pause Saute à partir d'un (code> Rendement Ed Block. Donc, je peux faire: def do_yielield; rendement; finir; do_yield {eval "met 1; met 2; pause; met 3"}; met 5 et je reçois le résultat attendu. Je ne sais pas pourquoi cela fonctionne!


5 Réponses :


2
votes

Vous pouvez simplement utiliser des conditionnels plutôt que des retours anticipés.


0 commentaires

3
votes

Le code EVAL'D n'est que d'être exécuté dans cet endroit. Ce n'est pas une fonction ou un bloc. Comment le feriez-vous sans eval? Probablement comme ceci: xxx


0 commentaires

3
votes

Vous ne pouvez pas. Vous pouvez revenir en dehors des méthodes et sortir des blocs ou des boucles, mais pas Eval.

Vous pouvez essayer un bloc de lancer / capture à la place xxx

ou ceci: < / p> xxx

ou juste faire un conditionnel comme le dit MCHL, car vous le souhaitez probablement d'une butée conditionnelle, pas seulement toujours, mais que je te lance la capture vous permettra de sauter d'un bloc, peu importe la façon dont De nombreux niveaux vous sont, ce qui le rend plus robuste, si vous devez sortir d'une boucle imbriquée ou quelque chose comme ça.


2 commentaires

Réponse géniale! De cette façon, je peux mettre attraper: arrêter do ... fin autour eval et utiliser uniquement le lancer à l'intérieur ! Avant votre réponse, je pensais à utiliser suite , mais attrape / jette est de loin meilleur car il n'implique pas les variables globales CC, seuls les symboles.


Je n'ai pas réalisé que, mais c'est cool, vous pouvez les mettre de côté du bloc d'évaluation. Whoa.



4
votes

Merci à tous, mais j'ai trouvé une solution qui convient à mon problème: xxx

de cette façon, le mot clé intuitif peut être utilisé à l'intérieur eval pour en sortir avec succès.

Je n'ai pas aimé les solutions de type conditionnel dans ce cas parce que cela me forcerait (ou l'utilisateur) d'ajouter une extrémité / Code> à la fin.

À propos de Jeton / Catch ou BAASE , je considère que le mot clé est plus intuitif .


0 commentaires

0
votes

Vous pouvez très heureusement définir une fonction et l'exécuter en fin de compte à la fin du script comme suit: xxx

démo


0 commentaires