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) { ... }
3 Réponses :
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 code> pour
Collection code> comme suit: p>
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; } }
Vous pouvez spécifier le ou utilisez une structure dédiée pour l'itération (comme c'est le cas dans le module Donc, l'itération est faite comme si p> Vous pouvez également ajouter un avant code>,
POPFRONT () code> et
vide code> Fonctions: (mais cela consommera votre collection sauf si vous n'utilisez sauvegarde () )
std.container code> p>
opapply code> pour la normale foreach: p>
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 code> 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 i> sans utiliser Enregistrer code>, votre conteneur sera consommé. La bonne façon de faire cela est de l'implémentation
opslice code> 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 code>. Ils ne sont pas des gammes. Les gammes de conteneurs ont
Enregistrer les fonctions code>.
DUP CODE> ET
Enregistrer CODE> Faites aussi des choses très différentes.
DUP CODE> Crée un conteneur distinct avec des éléments distincts qui sont égaux à ce qui était dans le premier conteneur mais ne sont pas i> les mêmes éléments, tandis que
Enregistrer code> 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 code> 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 code> et
DUP code> et des tableaux.
Enregistrer code> juste des tranches. Toute modification de la tranche affecte l'original. Avec
DUP code>, 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).