2012-01-04 3 views
10

В D Как применить функцию ко всем элементам в массиве?В D как применить функцию ко всем элементам массива?

Например, я хочу применить функцию std.string.leftJustify() ко всем элементам массива строк.

Я знаю, что могу использовать цикл, но есть ли хорошая функция карты? Я вижу, что есть один в библиотеке std.algorithm, но я понятия не имею, как использовать шаблоны в D еще.

Есть несколько примеров?

ответ

12

Существует множество опций для указания лямбда. map возвращает диапазон, который лениво оценивает по мере его потребления. Вы можете принудительно произвести немедленную оценку, используя функцию array от 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

ключевое слово «делегат» необязательно, поэтому вы можете написать просто auto lj = map! ((A) {return a.leftJustify (10);}) (x); – Nekuromento

+0

Я не верю, что это делает то, что хочет OP. Здесь 'x' останется неизменным. Я считаю, что он хочет изменить элементы на месте. –

+0

Нельзя ли просто передать делегата с параметром ref, который изменяет элемент? – 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

Верхний использует новый синтаксис лямбда, который не будет работать до выхода DMD 2.058. – eco

+0

Я бы использовал эту нотацию, чтобы применить приведенную выше строковую функцию ко всем элементам? –

+0

@GaryWilloughby: Да. – DejanLekic

Смежные вопросы