Sök…


Anmärkningar

Om en förfrågan stöter på kompilatorn

foreach (element; range) {

den skrivs internt på samma sätt som följande:

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

Alla objekt som uppfyller ovanstående gränssnitt kallas ett inmatningsområde och är således en typ som kan itereras över:

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

Strängar och matriser är intervall

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

Skapa en ny inmatningsområde

InputRange konceptet har tre funktioner, exempel:

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

Kort sagt, ett sätt att

  1. kontrollera om intervallet är tomt
  2. få det aktuella elementet
  3. gå till nästa element

För att göra vår egen typ till InputRange måste vi implementera dessa tre funktioner. Låt oss titta på den oändliga kvadratsekvensen.

struct SquaresRange {
    int cur = 1;

    @property bool empty() {
        return false;
    }

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

    void popFront() {
        cur++;
    }
}

Se D-turnén för ett exempel med Fibonacci.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow