DP Delphi / Pascal  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Анонимные методы и замыкания

Тест собран как небольшая техническая ревизия: часть вопросов требует вычислить результат, часть — обнаружить дефект, предложить проверяемое исправление или уточнить контракт. В наборе 25 вопросов, 15 из них содержат код. Разделы: «Ссылки на процедуры», «Захват переменной», «Время жизни», «Обратные вызовы» и «Проверка допущений».

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На весь тест отведено 70 минут. Код лучше сначала разобрать вручную: правильный вариант должен объяснять механизм, а не только совпадать с одним запуском.
Вопрос 1 из 25
В `AnonymousType` сначала встречается `TOperation = reference to function(X: Integer): Integer;`, а затем `Op := function(X: Integer): Integer`. Какой вывод можно сделать только после чтения обеих строк?
PascalDelphi / Pascal · Ссылки на процедуры
// Определите реальную гарантию в AnonymousType.
program AnonymousType;
{$APPTYPE CONSOLE}
type
  TOperation = reference to function(X: Integer): Integer;
var
  Op: TOperation;
begin
  Op := function(X: Integer): Integer
    begin
      Result := X * X;
    end;
  Writeln(Op(4));
end.
Вопрос 2 из 25
Две реализации темы «Захват переменной» совпадают на обычном примере. Какое различие всё же меняет их договор?
Вопрос 3 из 25
В практическом сценарии по теме «Время жизни» меняются входные данные и порядок действий. Какой вывод остаётся корректным?
Вопрос 4 из 25
Модуль, использующий тему «Обратные вызовы», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре?
Вопрос 5 из 25
Какие два независимых сценария нужны, чтобы проверить и состояние счётчика, и время жизни замыкания?
Вопрос 6 из 25
Обычный пример по теме «Ссылки на процедуры» проходит, но после изменения состояния возникает дефект. Какое условие объясняет его источник?
Вопрос 7 из 25
Реализацию темы «Захват переменной» заменяют без изменения интерфейса. Какое наблюдаемое свойство обязано сохраниться?
Вопрос 8 из 25
Обычный пример по теме «Время жизни» проходит, но после изменения состояния возникает дефект. Какое условие объясняет его источник?
Вопрос 9 из 25
В теме «Обратные вызовы» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 10 из 25
Какие два значения напечатает `ClosureTest`, и почему второй вызов `F()` видит изменение, сделанное первым?
PascalDelphi / Pascal · Проверка допущений
// Определите реальную гарантию в ClosureTest.
program ClosureTest;
{$APPTYPE CONSOLE}
type
  TFunc = reference to function: Integer;
function BuildCounter: TFunc;
var
  N: Integer;
begin
  N := 0;
  Result := function: Integer
    begin
      Inc(N);
      Result := N;
    end;
end;
var F: TFunc;
begin
  F := BuildCounter;
  Writeln(F());
  Writeln(F());
  F := nil;
end.
Вопрос 11 из 25
Правка по теме «Ссылки на процедуры» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 12 из 25
Какой сценарий по теме «Захват переменной» отличит исправную реализацию от версии со скрытым дефектом?
Вопрос 13 из 25
Для темы «Время жизни» обычный путь и граничный путь дают разные риски. Какой вывод учитывает оба, не подменяя один другим?
Вопрос 14 из 25
Какой граничный результат следует ожидать в `CallbackContract`, когда после `TTask.Run(` выполняется `on E: Exception do`?
PascalDelphi / Pascal · Обратные вызовы
// Разберите поток, число вызовов и передачу ошибки в CallbackContract.
program CallbackContract;
{$APPTYPE CONSOLE}
uses System.SysUtils, System.Threading;
type
  TDone = reference to procedure(const Value, ErrorText: string);
procedure LoadAsync(const Callback: TDone);
begin
  TTask.Run(
    procedure
    begin
      try
        Callback('42', '');
      except
        on E: Exception do
          Callback('', E.ClassName + ': ' + E.Message);
      end;
    end);
end;
begin
end.
Вопрос 15 из 25
Реализацию темы «Проверка допущений» заменяют без изменения интерфейса. Какое наблюдаемое свойство обязано сохраниться?
Вопрос 16 из 25
Какое свойство темы «Ссылки на процедуры» становится решающим на граничном входе или при другом порядке действий?
Вопрос 17 из 25
В теме «Захват переменной» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 18 из 25
Что произойдёт при вызове `Action` после `Worker.Free` в показанном `ClosureLifetime`, и какая граница времени жизни это объясняет?
PascalDelphi / Pascal · Время жизни
// Разберите, что переживает освобождение объекта в ClosureLifetime.
program ClosureLifetime;
{$APPTYPE CONSOLE}
type
  TAction = reference to procedure;
  TWorker = class
  public
    function MakeAction: TAction;
  end;
function TWorker.MakeAction: TAction;
begin
  Result :=
    procedure
    begin
      Writeln(Self.ClassName);
    end;
end;
var
  Worker: TWorker;
  Action: TAction;
begin
  Worker := TWorker.Create;
  Action := Worker.MakeAction;
  Worker.Free;
  { Намеренно опасный поздний вызов: Self уже указывает на уничтоженный объект. }
  Action;
  Action := nil;
end.
Вопрос 19 из 25
Правка по теме «Обратные вызовы» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 20 из 25
Какой результат должен сохраниться, если между созданием счётчика и вторым вызовом добавить другой код, не меняющий `F`?
Вопрос 21 из 25
Для темы «Ссылки на процедуры» готовят регрессионный набор из двух разных сценариев. Какой набор действительно закрывает обе границы?
Вопрос 22 из 25
Почему все три вызова `Actions[0]`, `Actions[1]` и `Actions[2]` печатают одно и то же число `7`?
PascalDelphi / Pascal · Захват переменной
// Все три обработчика захватывают одну и ту же переменную I.
program ClosureCapture;
{$APPTYPE CONSOLE}
type
  TAction = reference to procedure;
var
  I: Integer;
  Actions: array[0..2] of TAction;
begin
  I := 0;
  Actions[0] := procedure begin Writeln(I); end;
  Inc(I);
  Actions[1] := procedure begin Writeln(I); end;
  Inc(I);
  Actions[2] := procedure begin Writeln(I); end;
  I := 7;
  Actions[0];
  Actions[1];
  Actions[2];
end.
Вопрос 23 из 25
Правка по теме «Время жизни» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 24 из 25
Какое свойство темы «Обратные вызовы» становится решающим на граничном входе или при другом порядке действий?
Вопрос 25 из 25
Модуль, использующий тему «Проверка допущений», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу