Const функция в Delphi - PullRequest
       15

Const функция в Delphi

3 голосов
/ 07 апреля 2011

В коде Delphi, который я смотрю, я нашел следующий набор строк:

const
    function1: function(const S: String): String = SomeVariable1;
    function2: function(const S: String): String = SomeVariable2;

Что это делает?Я имею в виду не реальный код внутри функций, но что он делает, чтобы объявить функцию в разделе const и сравнить (?) Ее со значением переменной?Я предполагаю, что единичные равные являются сравнением, поскольку это то же самое, что и везде в Delphi.

Спасибо.

Ответы [ 2 ]

18 голосов
/ 07 апреля 2011

Нет, equals - это присвоение, так как это то, как присваиваются константы. Рассмотрим, например,

const Pi = 3.1415;

или

const s = 'This is an example';

Существуют также «типизированные константы»:

const Pi: extended = 3.1415;

В приведенном выше фрагменте мы определяем типизированную константу, которая содержит функцию сигнатуры function(const S: String): String. И мы назначаем ему (совместимую) функцию SomeVariable1.

SomVariable1 должен быть определен ранее в коде, например, как

function SomeVariable1(const S: String): String;
begin
  result := S + '!';
end;

Рассмотрим следующий пример:

function SomeVariable1(const S: String): String;
begin
  result := S + '!';
end;

const
  function1: function(const S: String): String = SomeVariable1;

procedure TForm1.FormCreate(Sender: TObject);
begin
  caption := function1('test');
end;
8 голосов
/ 07 апреля 2011

Ответ Андреаса охватывает технические аспекты очень хорошо, но я хотел бы дать ответ на эту часть:

Что это делает?

Ещелинии Why use this weired-looking construct?Я могу думать о двух причинах:

  • Код написан с помощью {$J+} (присваиваемые типизированные константы), и «константе» в некоторой точке присваивается другое значение.Если function1 были объявлены как переменные, инициализация должна была бы быть сделана в секции initialization модуля, и это могло бы быть слишком поздно (если секция initialization какого-то другого модуля запускается до этого и пытается вызватьfunction1 "функция")
  • Используется, если имя функции было изменено с function1 на SomeVariable1, и существует код сторонней организации, который не может быть легко изменен.Это обеспечивает способ объявления псевдонима в одну строку.
...