D Language
Gammes
Recherche…
Remarques
Si un compilateur rencontre un foreach
foreach (element; range) {
il est réécrit en interne comme suit:
for (auto it = range; !it.empty; it.popFront()) { auto element = it.front; ... }
Tout objet remplissant l'interface ci-dessus est appelé une plage d'entrée et est donc un type pouvant être itéré sur:
struct InputRange {
@property bool empty();
@property T front();
void popFront();
}
Les chaînes et les tableaux sont des plages
import std.stdio; void main() { auto s = "hello world"; auto a = [1, 2, 3, 4]; foreach (c; s) { write(c, "!"); // h!e!l!l!o! !w!o!r!l!d! } writeln(); foreach (x; a) { write(x * x, ", "); // 1, 4, 9, 16, } }
Créer un nouveau type de plage d'entrée
Le concept InputRange
a trois fonctions, par exemple:
struct InputRange(T) { @property bool empty(); @property T front(); void popFront(); }
En bref, un moyen de
- vérifier si la plage est vide
- obtenir l'élément actuel
- passer à l'élément suivant
Pour faire de notre type un InputRange
, nous devons implémenter ces trois fonctions. Regardons la suite infinie de carrés.
struct SquaresRange { int cur = 1; @property bool empty() { return false; } @property int front() { return cur^^2; } void popFront() { cur++; } }
Voir le D tour pour un exemple avec Fibonacci.
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow