標準モジュールstd.range とstd.algorithm は、構成要素としてレンジを基本にした、より読みやすい方法で複雑な 操作を表現することができる多くの優れた関数を提供します。
これらのアルゴリズムの素晴らしい点はただレンジを定義するだけで すでにある標準ライブラリから直接利益を受けられるところです。
filter
- テンプレート引数としてラムダを取り、要素をフィルタした新しいレンジを生成します:
filter!"a > 20"(range);
filter!(a => a > 20)(range);
map
- テンプレートパラメータとして定義された述語を使って新しいレンジを生成します:
[1, 2, 3].map!(x => to!string(x));
each
- レンジを噛み砕く関数としての手軽なforeach
です:
[1, 2, 3].each!(a => writeln(a));
take
- N個の要素へ制限します:
theBigBigRange.take(10);
zip
- 2つのレンジを同時に処理しその2つからタプルを返します:
assert(zip([1,2], ["hello","world"]).front
== tuple(1, "hello"));
generate
- 関数を取り各反復処理でそれを呼びレンジを生成します、たとえば:
alias RandomRange = generate!(() => uniform(1, 1000));
cycle
- 与えられた入力のレンジを永遠に繰り返すレンジを返します。
auto c = cycle([1]);
// レンジは空になりません!
assert(!c.empty);