D Language
Bereiche
Suche…
Bemerkungen
Wenn der Compiler auf eine Foreach trifft
foreach (element; range) {
Es wird intern wie folgt umgeschrieben:
for (auto it = range; !it.empty; it.popFront()) { auto element = it.front; ... }
Jedes Objekt, das die obige Schnittstelle erfüllt, wird als Eingabebereich bezeichnet und ist daher ein Typ, über den iteriert werden kann
struct InputRange {
@property bool empty();
@property T front();
void popFront();
}
Strings und Arrays sind Bereiche
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, } }
Einen neuen Eingabebereichstyp erstellen
Das InputRange
Konzept hat drei Funktionen, beispielsweise:
struct InputRange(T) { @property bool empty(); @property T front(); void popFront(); }
Kurz gesagt, ein Weg zu
- Prüfen Sie, ob der Bereich leer ist
- Holen Sie sich das aktuelle Element
- zum nächsten Element wechseln
Um aus unserem eigenen Typ einen InputRange
, müssen wir diese drei Funktionen implementieren. Schauen wir uns die unendliche Folge von Quadraten an.
struct SquaresRange { int cur = 1; @property bool empty() { return false; } @property int front() { return cur^^2; } void popFront() { cur++; } }
Siehe die D-Tour für ein Beispiel mit Fibonacci.
Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow