Est-il un foreach méthode générique en Delphi pour que peut être appelée avec la fonction anonyme
Je peux faire la suite en C++
for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;});
Je voudrais faire la meme/similaire à Delphes.
J'ai demandé à un question plus tôt pour les développeurs C++, et a voulu produire un exemple similaire en programmation orientée objet, Pascal.
Le lambda (méthode anonyme) de la partie de la question ne se pose pas vraiment, mais je me demandais Si je pouvais faire la même chose dans Delphi XE2.
Je pose la question parce que j'ai XE, et je ne suis pas sûr de savoir si elle a été ajoutée.
Merci.
OriginalL'auteur Mihaela | 2012-03-09
Vous devez vous connecter pour publier un commentaire.
Probablement le plus proche de Delphi analogique à
std::vector<T>
estTList<T>
. Vous pouvez parcourir la liste avec unfor
boucle:Si vous avez un tableau dynamique plutôt qu'un
TList<T>
ensuite, vous pouvez utiliserfor in
pour itérer sur les éléments. En fait, tous les construit dans des conteneurs de soutienfor in
et il est facile d'ajouter le support pourfor in
à vos propres classes.En C++ il n'y a rien de tel qu'un
for in
boucle et donc le langage est d'utiliser un STL algorithme. Qu'est ce qui vous pousse à l'aide d'une fonction anonyme. En Delphi avec lefor in
syntaxe que vous pouvez exprimer "itérer sur tous les membres du conteneur" de manière naturelle, sans avoir recours à des méthodes anonymes.Génériques ont été ajoutés à Delphi et Delphi 2009 et le
for in
boucle a été ajouté dans Delphi 2005, donc tout cela est à votre disposition dans XE. Pour ce que ça vaut, les anonymous ont également ajouté dans Delphi 2009.Ce que vous devez comprendre, c'est que Delphi génériques sont moins puissants que les modèles C++. Bien que vous parlez d'un générique
foreach
, votre code n'est pas générique dans le sens où il s'est spécialisé àint
. Vous pouvez écrire une version générique de votre code en C++, mais ce serait beaucoup plus difficile à faire avec Delphi génériques en raison des limites inhérentes à des génériques lorsque comparé à des modèles. Une tentative d'écrire le code ci-dessus de manière générique dans Delphi serait fondateur à l'endroit où vous essayé d'appelerWriteln
. Alors que ce serait trivial avec les modèles C++, il est malheureusement hors de portée pour les génériques.Mise à jour: Dans les commentaires vous demander s'il y a une nappe de façon à ajouter le contenu d'un récipient à un autre. Le
AddRange
méthode ne permet que.TList<T>.AddRange()
a trois surchargé de variantes que de recevoir l'un des paramètres d'entrée suivants:array of T
,Collection: IEnumerable<T>
ouCollection: TEnumerable<T>
. Tous les génériques des conteneurs suivent un schéma similaire.Lambda/Fermeture/Anonfunction syntaxe est donc MALADROIT de delphes, qu'il est assez grand que vous n'en avez pas besoin pour
for
boucles. C++ idiomes comme d'habitude, ne se traduisent pas bien à pascal. Mais C# et Delphi sont assez proches en effet.Je trouve qu'il est très utile en C++. Non seulement le code plus propre(pour les petites fonctions anonymes), mais en C++, il devient souvent inline et génère plus rapide du code.
Oui, la syntaxe pour anon proc est un problème
Désolé, j'ai collé le code incorrect :(. J'ai fait l'itération sur les médicaments Génériques.Les Collections.TList<Integer>: pour aInt à aGen faire Écrire(Format('%d ', [aInt]));
OriginalL'auteur David Heffernan