配列の添字のオーバーロード等で配列のカプセル化をしよう
とりあえず配列を透過させれば良いとの考えで。(注:実装は後で変更すれば良い/オーバーロードして変更ができるように)
module array; class Array(T){ T[] t; abstract this(){ //実装を変えるにはopIndex、opApplyと共にオーバーロードしれ } this(T[] t){ this.t=t; } ///添字 T opIndex(int i){ return t[i]; } ///foreachの時の int opApply(int delegate(inout T) dg){ int result; for (int i = 0; i < t.length; i++){ result = dg(t[i]); if(result) break; } return result; } }
使い方はこんな感じ
private import array; private import std.stdio; alias Array!(char[]) CharArrArray; CharArrArray getList(){ static char[][] te=["test1","test2"]; return new CharArrArray(te); } /+別の実装法(検索で次々に見付けてく場合等には有効) class CharArrArray:Array!(char[]){ this(){ } this(char[] t){ assert(0);//使うな } T opIndex(int i){ } int opApply(int delegate(inout T) dg){ } } +/ int main(){ static char[][] te=["test","test"]; CharArrArray test=getList(); foreach(char[] te;test){//foreachで回せ writef(te~"\n"); } return 0; }
Tから派生できれば配列のDecoderパターンが作れそう(意味あるのか?)だけど当前ながら配列からの派生はできない。
なんとなくタイトル変更。
opIndexを無くせばIteratorもどきができる…と。
Iteratorはforeach文で回せればnextは要らない気がするがどうなんだろう…?