Se supone que no debe saber ni importar qué devuelve std.algorithm.map
más allá del hecho de que se trata de un rango del mismo género que el que se pasó (directo, bidireccional, aleatorio, etc.). Es así con la mayoría de las funciones basadas en rango. Casi siempre devuelven un rango nuevo que envuelve el que ingresó o el mismo tipo de rango que se transfirió (por ejemplo, map
; el primero; find
hace esto último). Utilice auto
:
ulong[] x = [1, 2, 3];
auto y = map!"a"(x);
La gama devuelto por map
es perezoso. No hace nada hasta que itere sobre él (luego llama a la función dada en cada front
sucesivos del rango subyacente). Es más eficiente de esa manera (así como también permite intervalos infinitos). El tipo de devolución exacto depende del tipo de rango que ingresó y es local en map
, por lo que no puede crear uno directamente. Es necesario para cualquiera que use auto
para inferir el tipo o typeof
para obtener el tipo:
typeof(map!"a"(x)) y = map!"a"(x);
Sin embargo, por lo general sólo se utiliza typeof
cuando se necesita una variable que no se puede inicializar directamente. auto
es casi siempre el camino a seguir.
Si necesita crear una matriz a partir del resultado de map
(o de cualquier otro rango), a continuación, utilizar std.array.array
:
ulong[] y = array(map!"a"(x));
Si usted no sabe mucho acerca de rangos, entonces probablemente debería leer this. Desafortunadamente, actualmente no existe un artículo sobre los rangos de explicación de dlang.org, pero ese enlace es para un capítulo de un libro que uno de los miembros de la comunidad D escribió en turco y ha traducido al inglés, y cubre rangos de manera justa. bien.
EDITAR:
Walter Bright escribió recientemente un artículo específicamente acerca de los tipos que son locales a una función, sino que devuelve la función que también puede ayudar a iluminar. Incluso reciben un nombre genial: Voldemort Types in D
.
"No se supone que debes saber o preocuparte". Por favor, corrígeme si me equivoco, pero si no lo sé/me importa, entonces mi ejemplo debería compilar – dnsmkl
Quiero decir que no debería saber o preocuparse porque todo lo que necesita saber es que se trata de un rango del el mismo género que el que se pasó. El tipo exacto es específico de 'map' y no algo que vas a usar. Solo usas 'auto' para inferir el tipo y usar el rango con la API que tienen los rangos. Si desea que sea realmente un tipo específico, debe convertirlo a ese tipo con una función que tome un rango y genere el tipo que desee (por ejemplo, std.array.array). –
Parece antinatural que estoy * forzado * a usar 'auto' para usar el resultado del mapa (incluso si me gusta laizy eval. Y otras cosas) De todos modos, gracias por la respuesta y el enlace – dnsmkl