4

std.array.replaceだから私は今日Dプログラミング言語をいじっていましたが、戻り値の型で使用する方法に関する情報を見つけることができませんでした.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 を使用しています。

4

1 に答える 1

4

std.array.replace配列で機能しますmapが、範囲を返します。範囲を配列に変換するには (すべての要素にメモリを割り当てます)、array関数を使用します。

したがって、あなたの例は次のようになります。

return data.map!"a + 1"
           .array
           .replace(2, 1);
于 2013-12-23T19:09:17.970 に答える