J'ai un itérateur avec cette interface: $ HIT-> NEXT_SP
L'implémentation actuelle pour l'appliquer est la suivante: p> Je pense que je pense qu'il pourrait y avoir Soyez de meilleurs moyens de le faire en moins de code. Que dites-vous, des gerbeurs? P> p>
3 Réponses :
Cela dépend entièrement de la mise en œuvre de l'itérateur. Si NEXT_HSP code> est la seule méthode disponible, alors vous le faites correctement. P>
Tous les itérateurs que j'ai jamais vu retour Undef code> pour signifier qu'ils sont épuisés. Par conséquent, vous devriez écrire
pendant (défini (mon $ hsp = $ hit-> next_sp)) code>. L'exemple suivant montre la faute dans la question qui teste la vérité (abandonne à 1) au lieu de la définition (passes 'décollage').
use 5.010;
my $hit = __PACKAGE__;
sub next_hsp {
state $i;
$i++;
return ['mumble', 4, 3, 2, 1, 0, 'liftoff']->[$i];
}
# insert snippet from question here
C'est un bon point. Cela rend toute la chose encore plus difficile, mais vous avez raison.
Un motif commun est pour un itérateur de simplement retour code> sans arguments à la fin. Dans un contexte scalaire qui se transforme en
undef code> mais si vous dites
mon ($ hsp) = $ hit-> next_hsp code> alors que l'itérateur peut revenir en toute sécurité une valeur de non-défense (ou quoi que ce soit sinon qui pourrait être interprété comme faux) dans les cas où il est logique de le faire. Cela fonctionne car une liste contenant 1 valeur sera fidèle de Booléen, que la valeur soit fausse ou même undef.
Tous les itérateurs? J'ai vu un certain nombre d'infinis. :)
Ne vous inquiétez pas de jouer au golf, le code que vous avez l'air bien (autre que les autres réponses sur l'utilisation de Le premier est évident, le refacteur dans une fonction utilitaire, de sorte que vous avez La deuxième question est un peu plus profonde - mais pour moi sent plus que de jouer au golf. L'ensemble des itérateurs est de consommer comme vous en avez besoin, de sorte que si vous vous trouvez cela souvent, êtes-vous sûr que c'est vraiment la bonne chose à faire? Peut-être que votre déplacement de ces données en dehors de votre propre API, vous êtes donc contraint aux choix d'autres, mais si vous avez la possibilité de consommer un itérateur plutôt qu'une liste, cela sera peut-être une solution plus propre. P> défini code>). Cependant, si vous vous trouvez en train de répéter ce modèle 2, les choses se viennent à l'esprit. P>
mon @List = expand ($ hit). code> p> p>
Montrez-nous des programmes de démonstration complètes afin que nous puissions voir des choses comme la manière dont vous avez
$ hit code>.