謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

配列の添字のオーバーロード等で配列のカプセル化をしよう

とりあえず配列を透過させれば良いとの考えで。(注:実装は後で変更すれば良い/オーバーロードして変更ができるように)

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は要らない気がするがどうなんだろう…?