7
votes

foreach énoncé surcharger en D langue de programmation

Bonjour, je voudrais définir ma propre collection de cours et le rendre ibler dans une déclaration de foresach, comme ceci:

public class Collection(Type)
{
    ...
    private T head;
    private Collection!(T) queue;
}

Collection!(int) temp;
foreach (int t; temp) { ... }


0 commentaires

3 Réponses :


5
votes

Jetez un coup d'œil à ce Documentation sur les recherches et faites défiler un peu.

Si je lis votre exemple correctement, vous pouvez définir un oPapply pour Collection comme suit: xxx


0 commentaires

3
votes

Votre classe de collecte devrait mettre en œuvre OPAPPLY. Votre corps de Foreach devient un délégué à une boucle interne et vous ithétiez sur votre collection interne (dans votre cas une file d'attente) à l'aide d'une boucle pour la boucle.

Considérez l'exemple donné dans le Docs P>

class Foo {
    uint array[2];

    int opApply(int delegate(ref uint) dg)    
    { int result = 0;

        for (int i = 0; i < array.length; i++)
        {
            result = dg(array[i]);
            if (result)
                break;
        }
        return result;
    }
}


0 commentaires

9
votes

Vous pouvez spécifier le avant , POPFRONT () et vide Fonctions: (mais cela consommera votre collection sauf si vous n'utilisez sauvegarde () ) xxx

ou utilisez une structure dédiée pour l'itération (comme c'est le cas dans le module std.container xxx

Donc, l'itération est faite comme si xxx

Vous pouvez également ajouter un opapply pour la normale foreach: xxx


7 commentaires

Utilisez la structure dédiée. Une plage est différente d'un conteneur en ce qu'elle est consommée lors de l'itérale, lors de l'itération d'un conteneur que vous ne voulez pas consommer. Les tableau sont une sorte d'hybride ...


Si vous ne voulez pas qu'il soit consommé, utilisez la fonction Enregistrer pour obtenir une copie que vous pouvez consommer sans affecter le conteneur


@RatTatchetFreak C'est toujours une mauvaise pratique de traiter un conteneur comme une plage. Si vous le transmettez à peu près toute fonction basée sur la plage sans utiliser Enregistrer , votre conteneur sera consommé. La bonne façon de faire cela est de l'implémentation opslice et de renvoyer un type de plage pour ce conteneur. Avoir votre conteneur Mettre en œuvre les fonctions de la plage ne mendiera que de problèmes.


Je ne sais pas pourquoi, mais les gammes ont enregistré la définition de conteneur standard ne dispose pas d'une fonction de sauvegarde, bien que DUP soit similaire. d-programming-language.org/phobos/std_container.html


@he_the_great de conteneurs de cours n'a pas Enregistrer les fonctions . Ils ne sont pas des gammes. Les gammes de conteneurs ont Enregistrer les fonctions . DUP ET Enregistrer Faites aussi des choses très différentes. DUP Crée un conteneur distinct avec des éléments distincts qui sont égaux à ce qui était dans le premier conteneur mais ne sont pas les mêmes éléments, tandis que Enregistrer renvoie une plage qui pointe vers les mêmes éléments que la première plage. La modification de ces éléments modifie les éléments dans les deux gammes, alors que la modification des éléments dans un conteneur DUP ED ne modifie pas les éléments de l'original.


@Jonathanmdavis, la documentation que j'ai liée spécifiquement les états ne fait pas une copie profonde. Mais je suppose que si le contenu est des types de valeur, il y aurait une différence de la plage.save et de conteneur.dup.


@he_the_great C'est juste comme Enregistrer et DUP et des tableaux. Enregistrer juste des tranches. Toute modification de la tranche affecte l'original. Avec DUP , cependant, le conteneur et son contenu sont copiés. Donc, si vous modifiez les éléments dans un conteneur, cela ne change pas les éléments de l'autre. Cependant, la copie des types de références qui copie simplement les références. Donc, si vous modifiez l'état d'un élément qui est un type de référence, bien sûr, il sera affecté dans les deux conteneurs. Mais si vous deviez réaffecter un élément dans un conteneur avec un objet différent, un seul serait affecté (contrairement à une tranche).