D Language
Intervalli
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
- controlla se l'intervallo è vuoto
- ottieni l'elemento corrente
- 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