在std.algorithm.map的结果上使用std.array.replace

时间:2013-12-23 19:02:30

标签: d phobos

所以今天我正在摆弄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):错误:模板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。

1 个答案:

答案 0 :(得分:4)

std.array.replace适用于数组,而map则返回一个范围。要将范围转换为数组(将为所有元素分配内存),请使用array函数。

因此,您的示例变为:

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