Индексация и индексаторы
Для строк и массивов
Применение синтаксиса индексации к строкам - это синтаксический сахар для вызова CharAt, а если индекса два (диапазон), то для Slice. Для массивов диапазоны это тоже Slice.
string s="test"; WriteLine(s[2]); //s //s[2] - это s.CharAt(2). Индекс не может быть отрицательным! //если нужен доступ к символам через отрицательный индекс, то используйте At: WriteLine(s.At(-3)); //e //если нужно взять подстроку в диапазоне, то: WriteLine(s[1..3]); //es //s[1..3] - это s.Slice(1, 3) WriteLine(s[1, 3]); //можно и так. На самом деле для интерпретатора s[1..3] это s[1, 3]. //для массивов тоже работает: int[] arr={0, 10, 20, 30, 40, 50}; WriteLine(Join(' ', arr[1..-1])); //10 20 30 40 //arr[1..-1] - это arr.Slice(1, -1) //с отрицательным индексом: WriteLine(arr.At(-3)); //30
Для объектов своих типов
Методы индексатора это GetItem и SetItem, которые вызываются при применении к экземпляру синтаксиса индексирования (квадратных скобок): объект[индекс-0, индекс-1, индекс-2, ...]. Пример матрицы с индексатором:
int mw=3, mh=4, v; Matrix m=new Matrix(mw, mh); foreach(int y in Range(mh)){ foreach(int x in Range(mw)){ m[x, y]=v++; //это m.SetItem(x, y, v++); } } WriteLine(m[0, 0]); //0 //m[0, 0] - это m.GetItem(0, 0); WriteLine(m[1, 2]); //7 WriteLine(m[2, 3]); //11 class Matrix{ int[] Arr; int Width, Height, Count; New(int w, int h){ Width=w; Height=h; Count=w*h; Arr=new int[Count]; //по сути, матрица делается из обычного массива } public int GetItem(int x, int y){ //это метод индексатора возвращающий значение return Arr[GetIndex(x, y)]; } public SetItem(int x, int y, int value){ //это метод индексатора устанавливающий значение Arr[GetIndex(x, y)]=value; } int GetIndex(int x, int y){ //эта функция возвращает реальный индекс в массиве из x и y return x + (y * Width); } }
GetItem и SetItem должны быть публичными.