Использование std.array.replace для результата std.algorithm.map

Итак, сегодня я возился с языком программирования D и просто не смог найти никакой информации о том, как использовать std.array.replace для возвращаемого типа std.algorithm.map.

void main() {
    import std.stdio : writeln;

    writeln(test([1, 2, 3])); // desired result: [1, 3, 4]
}

auto test(int[] data) {
    import std.algorithm : map;
    import std.array : replace;

    return data.map!"a + 1"
               .replace(2, 1);
}

К сожалению, это не работает. Вместо этого происходит сбой со следующим сообщением об ошибке:

main.d(15): Ошибка: шаблон std.array.replace не соответствует ни одному объявлению шаблона функции. Кандидаты: /usr/share/dmd/src/phobos/std/array.d(1652): std.array.replace(E, R1, R2)(E[] subject, R1 from, R2 to) if (isDynamicArray !(E[]) && isForwardRange!R1 && isForwardRange!R2 && (hasLength!R2 || isSomeString!R2))

main.d(15): Ошибка: template std.array.replace(E, R1, R2)(E[] subject, R1 from, R2 to) if (isDynamicArray!(E[]) && isForwardRange!R1 && isForwardRange! R2 && (hasLength!R2 || isSomeString!R2)) не может вывести шаблонную функцию из типов аргументов !()(MapResult!(unaryFun, int[]), int, int)

В документации std.algorithm.map сказано, что он использует ленивую оценку, но даже использование std.array.array для преобразования результата у меня не работает.

Я использую DMD 2.064.2.


person Dominik Lohmann    schedule 23.12.2013    source источник


Ответы (1)


std.array.replace работает с массивами, тогда как map возвращает диапазон. Чтобы преобразовать диапазон в массив (который выделит память для всех элементов), используйте функцию array.

Таким образом, ваш пример становится:

return data.map!"a + 1"
           .array
           .replace(2, 1);
person Vladimir Panteleev    schedule 23.12.2013
comment
Спасибо. Все еще учусь — D — интересный язык для изучения, но мне кажется, что документации по std.range немного не хватает. - person Dominik Lohmann; 23.12.2013
comment
глава книги Али Чехрели о диапазонах может быть полезна для изучения концепций диапазонов. - person eco; 23.12.2013