配列にメソッド追加
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言語はライブラリでなく言語でサポートしてる範囲が広いのでえぇなぁ。