D Language
ranges
Zoeken…
Opmerkingen
Als een foreach wordt aangetroffen door de compiler
foreach (element; range) {
het is intern herschreven vergelijkbaar met het volgende:
for (auto it = range; !it.empty; it.popFront()) { auto element = it.front; ... }
Elk object dat aan de bovenstaande interface voldoet, wordt een invoerbereik genoemd en is dus een type dat kan worden herhaald:
struct InputRange {
@property bool empty();
@property T front();
void popFront();
}
Strings en arrays zijn bereiken
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, } }
Een nieuw type invoerbereik maken
Het InputRange
concept heeft drie functies, bijvoorbeeld:
struct InputRange(T) { @property bool empty(); @property T front(); void popFront(); }
Kortom, een manier om
- controleer of het bereik leeg is
- haal het huidige element op
- ga naar het volgende element
Om van ons eigen type een InputRange
, moeten we deze drie functies implementeren. Laten we eens kijken naar de oneindige reeks vierkanten.
struct SquaresRange { int cur = 1; @property bool empty() { return false; } @property int front() { return cur^^2; } void popFront() { cur++; } }
Zie de D-tour voor een voorbeeld met Fibonacci.
Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow