9.2 Энумераторы расширенной записи |
Вверх Предыдущий Следующий |
Расширенные записи могут иметь энумератор (перечислитель). С этой целью, должна быть определена функция, возвращающая как результат расширенную запись enumerator: type TIntArray = array[0..3] of Integer;
TEnumerator = record private FIndex: Integer; FArray: TIntArray; function GetCurrent: Integer; public function MoveNext: Boolean; property Current: Integer read GetCurrent; end;
TMyArray = record F: array[0..3] of Integer; function GetEnumerator: TEnumerator; end;
function TEnumerator.MoveNext: Boolean; begin inc(FIndex); Result := FIndex < Length(FArray); end;
function TEnumerator.GetCurrent: Integer; begin Result := FArray[FIndex]; end;
function TMyArray.GetEnumerator: TEnumerator; begin Result.FArray := F; Result.FIndex := -1; end; После этого определения, следующий код будет скомпилирован и перечислит все элементы в F: var Arr: TMyArray; I: Integer; begin for I in Arr do WriteLn(I); end. Тот же эффект может быть достигнут с помощью оператора перечисления: type TIntArray = array[0..3] of Integer;
TEnumerator = record private FIndex: Integer; FArray: TIntArray; function GetCurrent: Integer; public function MoveNext: Boolean; property Current: Integer read GetCurrent; end;
TMyArray = record F: array[0..3] of Integer; end;
function TEnumerator.MoveNext: Boolean; begin inc(FIndex); Result := FIndex < Length(FArray); end;
function TEnumerator.GetCurrent: Integer; begin Result := FArray[FIndex]; end;
operator Enumerator(const A: TMyArray): TEnumerator; begin Result.FArray := A.F; Result.FIndex := -1; end; Это позволит также исполнить код. |