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;

Это позволит также исполнить код.