に割り当てる範囲/反復子は:D2:コードは以下の点を考慮アレイスライス
enum size = 16;
double[size] arr1 = [...];
double[size] arr2 = [...];
process = (double x) { return (x + 1); };
arr2[] = map!(process)(arr1[]); // here
私は普通アレイへ戻るmap
のトラブル変換結果を有します。問題は、map
だけでなく、take
、repeat
、および範囲で動作するstd.algorithm
とstd.range
のすべてのこれらの優れたツールにも適用されます。
この割り当てでは、Error: cannot implicitly convert expression (map(arr1[])) of type Result to double[]
が得られます。
uint i = 0;
foreach (x; map!(process)(arr1[])) {
arr2[i] = x;
i++;
}
を使用せずに範囲を評価する方法はありますか?
さらに、静的な配列でmap!(process)(arr1)
の代わりにmap!(process)(arr1[])
と呼ぶ必要がある理由を説明してもらえますか?静的配列は、反復の手段として動的と互換性がないはずですか、何か得られませんか?
さらに、列挙構文foreach (index, item; sequence)
は範囲では機能しないようです - 回避策がありますか?理由は、範囲を配列スライスに割り当てることができない理由と同じだと思います。そのようなので、単にアレイに割り当てmap
とfilter
リターン範囲ではなく、アレイとして
ありがとう、ジョナサン!範囲と配列は異なる型であることはわかっていますが、Dは有限で配列の型と型互換性がある限り、範囲は配列に変換できるため、Dは暗黙の変換を実装できると考えていました。私はスタックとヒープの割り当ての違い、そして配列izingの計算とメモリのオーバーヘッドを認識していますが、とにかく警告してくれてありがとう:) IFTIでこれを明確にしてくれてありがとう - 私はこの権利を理解すれば、暗黙的に静的な配列をスライスすることができますが、今は不完全さのためにこの方法を使用するべきです。 – toriningen
静的配列を動的配列に暗黙的に変換するためにIFTI _might_を変更することはできますが、私はそれを疑っています。テンプレート化された関数を静的配列にすることは可能です(テンプレートのインスタンス化のために変換するのは悪くなります)。IFTIは暗黙の変換が見つかるまで試行し続けます。いくつかのテンプレートのセマンティクス)。だから、私は静的配列をスライスしてレンジベースの関数に渡す必要があると思っていますが、少なくとも問題を軽減するためにある点で改善がなされるかもしれません。 –