6
votes

Quelle est la manière la plus élégante de Perl d'élargir un itérateur dans une liste?

J'ai un itérateur avec cette interface: $ HIT-> NEXT_SP

L'implémentation actuelle pour l'appliquer est la suivante: xxx

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?


1 commentaires

Montrez-nous des programmes de démonstration complètes afin que nous puissions voir des choses comme la manière dont vous avez $ hit .


3 Réponses :


3
votes

Cela dépend entièrement de la mise en œuvre de l'itérateur. Si NEXT_HSP est la seule méthode disponible, alors vous le faites correctement.


0 commentaires

5
votes

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


3 commentaires

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 sans arguments à la fin. Dans un contexte scalaire qui se transforme en undef mais si vous dites mon ($ hsp) = $ hit-> next_hsp 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. :)



3
votes

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 défini ). Cependant, si vous vous trouvez en train de répéter ce modèle 2, les choses se viennent à l'esprit.

Le premier est évident, le refacteur dans une fonction utilitaire, de sorte que vous avez mon @List = expand ($ hit).

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.


0 commentaires