配列にメソッド追加

id:kurimura さんとこの
2006-02-08

の第1引数が配列の関数は、配列のメソッドのように扱えるというの。
これがなんと template でもできた。
しかも ver0.149 から template の暗黙のインスタンス化がサポートされたので、記法もシンプル。

template max(T) {
  T max(T[] array) 
    in {
      assert(array.length != 0);
    }
    body {
      T maxValue = array[0];
      foreach (T elm; array) {
        if (maxValue < elm) maxValue = elm;
      }
      return maxValue;
    }
}

とかいうのが、

unittest {
  {
    static int[] array = [1, 2, 3];
    int maxval = array.max();
    writefln(maxval);
    foreach (int i; array) assert(maxval >= i);
  }

  writefln("OK unittest of max!(int)()");
}

といった使い方ができる。


但し、プロパティよろしく "()" を省略することはできない。
が、第1引数が配列の関数テンプレートを書くと、言語組み込みの配列にメソッドを追加した感じになっていい気分。
配列のユーティリティ的な関数テンプレートがみんなメソッド扱いにできる。


C++STL 的なものを作ってみたけど、D言語にはスライス式が使えるのでイテレータ的なものが欲しくなることはあまりない。あと、copy や for_each、transform もいらない感じ。
D言語はライブラリでなく言語でサポートしてる範囲が広いのでえぇなぁ。