2012-01-04 7 views
10

In D come si applica una funzione a tutti gli elementi di un array?In D come si applica una funzione a tutti gli elementi di un array?

Ad esempio, desidero applicare la funzione std.string.leftJustify() a tutti gli elementi di una serie di stringhe.

So che potrei usare un ciclo ma c'è una bella funzione mappa? Vedo che ce n'è uno nella libreria std.algorithm ma non ho idea di come utilizzare i modelli in D ancora.

Qualche esempio?

risposta

12

Ci sono molte opzioni per specificare il lambda. map restituisce un intervallo che pigramente valuta quando viene consumato. È possibile forzare la valutazione immediata utilizzando la funzione array da 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

è facoltativa, quindi puoi scrivere solo auto lj = map! ((A) {return a.leftJustify (10);}) (x); – Nekuromento

+0

Non credo che questo faccia ciò che l'OP vuole. Qui, 'x' rimarrà invariato. Credo che voglia modificare gli elementi sul posto. –

+0

Non dovrebbe essere possibile solo passare un delegato con parametro ref che cambia l'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

Quello in alto utilizza la nuova sintassi lambda che non funzionerà finché non uscirà DMD 2.058. – eco

+0

Vorrei usare questa notazione per applicare la funzione di stringa sopra a tutti gli elementi? –

+0

@GaryWilloughby: Sì. – DejanLekic

Problemi correlati