2012-01-04 15 views
10

W D jak zastosować funkcję do wszystkich elementów w tablicy?W D jak zastosować funkcję do wszystkich elementów w tablicy?

Na przykład chcę zastosować funkcję std.string.leftJustify() do wszystkich elementów w tablicy łańcuchowej.

Wiem, że mógłbym użyć pętli, ale czy jest tam fajna funkcja mapy? Widzę, że jest jeden w bibliotece std.algorithm, ale nie mam pojęcia, jak korzystać z szablonów w D jeszcze.

Dowolne przykłady?

Odpowiedz

12

Istnieje wiele opcji do określenia lambda. map zwraca zakres, który leniwie ocenia jako zużyty. Możesz wymusić natychmiastową ocenę przy użyciu funkcji array z 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

słowo kluczowe "delegate" jest opcjonalne, więc możesz napisać po prostu auto lj = map! ((A) {return a.leftJustify (10);}) (x); – Nekuromento

+0

Nie wierzę, że robi to, co chce OP. Tutaj 'x' pozostanie niezmienione. Uważam, że chce zmodyfikować elementy w miejscu. –

+0

Czy nie można po prostu przekazać delegata z parametrem ref, który zmienia element? – 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

W górnej używa się nowej składni lambda, która nie zadziała, dopóki nie pojawi się DMD 2.058. – eco

+0

Chciałbym użyć tej notacji do zastosowania powyższej funkcji ciągu do wszystkich elementów? –

+0

@GaryWilloughby: Tak. – DejanLekic

Powiązane problemy