Ricerca…


Osservazioni

Se un foreach viene incontrato dal compilatore

foreach (element; range) {

è riscritto internamente in modo simile al seguente:

for (auto it = range; !it.empty; it.popFront()) {
    auto element = it.front;
    ...
}

Qualsiasi oggetto che soddisfa l'interfaccia di cui sopra è chiamato un intervallo di input ed è quindi un tipo che può essere iterato su:

struct InputRange {
    @property bool empty();
    @property T front();
    void popFront();
}

Archi e array sono intervalli

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, 
    }
}

Creare un nuovo tipo di intervallo di input

Il concetto InputRange ha tre funzioni, esempio:

struct InputRange(T) {
    @property bool empty();
    @property T front();
    void popFront();
}

In breve, un modo per

  1. controlla se l'intervallo è vuoto
  2. ottieni l'elemento corrente
  3. passare all'elemento successivo

Per rendere il nostro tipo un InputRange , dobbiamo implementare queste tre funzioni. Diamo un'occhiata alla sequenza infinita di quadrati.

struct SquaresRange {
    int cur = 1;

    @property bool empty() {
        return false;
    }

    @property int front() {
        return cur^^2;
    }

    void popFront() {
        cur++;
    }
}

Vedi il tour di D per un esempio con Fibonacci.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow