Delphi: функция Result не очищается во время цикла for - PullRequest
5 голосов
/ 24 февраля 2011

это нормально?

for a := 1 to 10 do
    x.test;

   x.test;
   x.test;
   x.test;

function test: string;
begin
  {$IFDEF DEBUG}  DebugMessage('result check = '+Result,3); {$ENDIF}
   result := result + 'a';
end;

10:39:59: result check = 
10:39:59: result check = a
10:39:59: result check = aa
10:39:59: result check = aaa
10:39:59: result check = aaaa
10:39:59: result check = aaaaa
10:39:59: result check = aaaaaa
10:39:59: result check = aaaaaaa
10:39:59: result check = aaaaaaaa
10:39:59: result check = aaaaaaaaa

10:39:59: result check = 
10:39:59: result check = 
10:39:59: result check = 

Стек результата функции не освобождается во время цикла for?: O

Ответы [ 2 ]

9 голосов
/ 24 февраля 2011

Result рассматривается как неявный var параметр для вашей функции.

Представьте себе, если вы записали это явно так:

procedure test(var result: string);
begin
  result := result + 'a';
end;

for i := 1 to 10 do
  test(s);

Тогда вы ожидаете, что этодобавьте к s.

Тот факт, что вы выбрасываете Result каждый раз, когда вызываете его, является причиной того, что компилятор иногда решает завершить его.Как указывает @gabr, он решает не завершать эту неявную переменную внутри цикла в качестве оптимизации.

Если бы вы присваивали результат test строке каждый раз, когда вызывали test, тогдавы бы увидели, что строка удлиняется каждый раз, она никогда не будет повторно инициализирована.

Вот почему вы всегда должны инициализировать переменную результата.Он выглядит как локальная переменная, но его лучше всего рассматривать как параметр var.

5 голосов
/ 24 февраля 2011

Ну, вы всегда должны инициализировать результат функции.Не думайте, что для него будет установлено правильное значение только потому, что оно имеет динамический (в данном случае строковый) тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...