配列の添字のオーバーロード等で配列のカプセル化をしよう
とりあえず配列を透過させれば良いとの考えで。(注:実装は後で変更すれば良い/オーバーロードして変更ができるように)
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は要らない気がするがどうなんだろう…?