Как выйти с записью в качестве результата в Delphi?

#delphi

Вопрос:

В Delphi есть возможность выйти со значением (пример: Выход(0);), но как выйти со значением, если возвращаемое значение является записью?

 TIntResult = record
  Value: Integer;
  Error: String;
end;

function GetCount: TIntResu<
begin
  if not IsLoggedIn then
    Exit(Value: 0; Error: 'Not logged in'); // I want this

  if not IsAdmin then
    Exit(TIntResult(Value: 0; Error: 'Not Admin')); // or this
  ...
end;
 

Ответ №1:

Конечно, вы всегда можете использовать Result переменную и Exit .

Но если вы хотите использовать синтаксис Delphi 2009 Exit(...) — без указания TIntResult типизированной переменной-двумя наиболее очевидными вариантами являются следующие:

Использование конструктора

 type
  TIntResult = record
    Value: Integer;
    Error: string;
    constructor Create(AValue: Integer; const AError: string);
  end;

{ TIntResult }

constructor TIntResult.Create(AValue: Integer; const AError: string);
begin
  Value := AValue;
  Error := AError;
end;
 

Тогда вы можете сделать:

 function Test: TIntResu<
begin
  // ...
  Exit(TIntResult.Create(394, 'Invalid page.'));
end;
 

Использование TIntResult функции-возврата

 function IntRes(AValue: Integer; const AError: string): TIntResu<
begin
  Result.Value := AValue;
  Result.Error := AError;
end;
 

Тогда вы можете сделать:

 function Test: TIntResu<
begin
  // ...
  Exit(IntRes(394, 'Invalid page.'));
end;
 

Комментарии:

1. Это легко показывает, насколько похожи оба варианта; одна из вспомогательных функций «старой школы» существует уже Rect() целую вечность.