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

  1. Prüfen Sie, ob der Bereich leer ist
  2. Holen Sie sich das aktuelle Element
  3. 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