D Language
Gamas
Buscar..
Observaciones
Si el compilador encuentra un foreach
foreach (element; range) {
Es reescrito internamente similar al siguiente:
for (auto it = range; !it.empty; it.popFront()) { auto element = it.front; ... }
Cualquier objeto que cumpla con la interfaz anterior se denomina rango de entrada y, por lo tanto, es un tipo que se puede iterar sobre:
struct InputRange {
@property bool empty();
@property T front();
void popFront();
}
Las cuerdas y matrices son rangos.
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, } }
Haciendo un nuevo tipo de rango de entrada
El concepto InputRange
tiene tres funciones, ejemplo:
struct InputRange(T) { @property bool empty(); @property T front(); void popFront(); }
En definitiva, una forma de
- comprueba si el rango está vacío
- obtener el elemento actual
- pasar al siguiente elemento
Para hacer nuestro propio tipo un InputRange
, debemos implementar estas tres funciones. Echemos un vistazo a la secuencia infinita de cuadrados.
struct SquaresRange { int cur = 1; @property bool empty() { return false; } @property int front() { return cur^^2; } void popFront() { cur++; } }
Vea la gira D para ver un ejemplo con Fibonacci.
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow