Индексация и индексаторы
Для строк и массивов
Применение синтаксиса индексации к строкам - это синтаксический сахар для вызова 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 должны быть публичными.
