2012-01-04 20 views
10

En D, ¿cómo aplico una función a todos los elementos en una matriz?En D, ¿cómo aplico una función a todos los elementos en una matriz?

Por ejemplo, quiero aplicar la función std.string.leftJustify() a todos los elementos en una matriz de cadenas.

Sé que podría usar un bucle, pero ¿hay una buena función de mapa? Veo que hay uno en la biblioteca std.algorithm pero aún no tengo idea de cómo usar plantillas en D.

¿Algún ejemplos?

Respuesta

12

Hay muchas opciones para especificar la lambda. map devuelve un rango que evalúa perezosamente a medida que se consume. Puede forzar la evaluación inmediata utilizando la función array desde std.array.

import std.algorithm; 
import std.stdio; 
import std.string; 

void main() 
{ 
    auto x = ["test", "foo", "bar"]; 
    writeln(x); 

    auto lj = map!"a.leftJustify(10)"(x); // using string mixins 
    // alternative syntaxes: 
    // auto lj = map!q{a.leftJustify(10)}(x); 
    // auto lj = map!(delegate(a) { return a.leftJustify(10) })(x); 
    // auto lj = map!(a => a.leftJustify(10))(x); available in dmd 2.058 
    writeln(lj); 
} 
+0

palabra clave "delegar" es opcional, por lo que puede escribir solo auto lj = map! ((A) {return a.leftJustify (10);}) (x); – Nekuromento

+0

No creo que esto haga lo que el OP quiere. Aquí, 'x' permanecerá sin cambios. Creo que quiere modificar los elementos en su lugar. –

+0

¿No debería ser posible pasar un delegado con el parámetro ref que cambia el elemento? – Trass3r

4
import std.algorithm; 
import std.stdio; 

void main() 
{ 
    writeln(map!(a => a * 2)([1, 2, 3])); 
    writeln(map!(delegate(a) { return a * 2; })([1, 2, 3])); 
} 
+3

El superior utiliza la nueva sintaxis lambda que no funcionará hasta que aparezca DMD 2.058. – eco

+0

¿Usaría esta notación para aplicar la función de cadena anterior a todos los elementos? –

+0

@GaryWilloughby: Sí. – DejanLekic

Cuestiones relacionadas