Difference between revisions of "Unit/ru"
Line 53: | Line 53: | ||
Необязательные разделы [[Initialization|<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight>]] и [[Finalization|<syntaxhighlight lang="pascal" enclose="none">finalization</syntaxhighlight>]] могут следовать за кодом, который выполняется в начале/конце программы. | Необязательные разделы [[Initialization|<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight>]] и [[Finalization|<syntaxhighlight lang="pascal" enclose="none">finalization</syntaxhighlight>]] могут следовать за кодом, который выполняется в начале/конце программы. | ||
− | === | + | === Подробный пример модуля === |
− | + | Пошаговый пример: | |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
unit randomunit; | unit randomunit; | ||
− | // | + | // этот модуль что-то делает |
// public - - - - - - - - - - - - - - - - - - - - - - - - - | // public - - - - - - - - - - - - - - - - - - - - - - - - - | ||
Line 65: | Line 65: | ||
type | type | ||
− | + | // тип TRandomNumber становится видимым глобально, | |
− | + | // поскольку он где-то подключен (в операторе uses) | |
TRandomNumber = integer; | TRandomNumber = integer; | ||
− | // | + | // конечно, возможны блоки const и var, также |
− | + | // список сигнатур процедур/функций делает | |
− | // | + | // их доступными вовне модуля |
− | // | ||
function getRandomNumber(): TRandomNumber; | function getRandomNumber(): TRandomNumber; | ||
− | // | + | // реализация функции/процедуры |
− | // | + | // не должна находиться в разделе interface |
// private - - - - - - - - - - - - - - - - - - - - - - - - - | // private - - - - - - - - - - - - - - - - - - - - - - - - - | ||
Line 82: | Line 81: | ||
var | var | ||
− | + | // var разделе private | |
− | + | // => может изменяться только внутри этого модуля | |
chosenRandomNumber: TRandomNumber; | chosenRandomNumber: TRandomNumber; | ||
function getRandomNumber(): TRandomNumber; | function getRandomNumber(): TRandomNumber; | ||
begin | begin | ||
− | // | + | // возвращаем значение |
getRandomNumber := chosenRandomNumber; | getRandomNumber := chosenRandomNumber; | ||
end; | end; | ||
− | // initialization | + | // раздел initialization - это часть, выполняемая |
− | // | + | // при загрузке/включении модуля |
initialization | initialization | ||
begin | begin | ||
− | // | + | // выбираем наше случайное число |
chosenRandomNumber := 3; | chosenRandomNumber := 3; | ||
− | + | // выбранное броском игральной кости, | |
− | + | // гарантированно случайное | |
end; | end; | ||
− | // finalization | + | // finalization запускается по окончанию программы |
finalization | finalization | ||
begin | begin | ||
− | // | + | // этот модуль говорит "пока" по завершению программы |
− | writeln(' | + | writeln('пока'); |
end; | end; | ||
end.</syntaxhighlight> | end.</syntaxhighlight> | ||
− | + | Чтобы подключить модуль, просто используйте оператор <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>. | |
<syntaxhighlight lang="pascal" highlight="2-4"> | <syntaxhighlight lang="pascal" highlight="2-4"> | ||
program chooseNextCandidate; | program chooseNextCandidate; | ||
uses | uses | ||
− | // | + | // подключение модуля |
randomunit; | randomunit; | ||
begin | begin | ||
− | writeln(' | + | writeln('следующий кандидат: №. ' + getRandomNumber()); |
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | При компиляции FPC проверяет эту программу на зависимости модулей. Он должен быть в состоянии найти модуль "randomunit". | |
− | |||
− | + | Самый простой способ удовлетворить это - иметь модуль, имя которого совпадает с именем файла, в котором он записан (добавление <tt>.pas</tt> - это нормально и приветствуется). Файл модуля может находиться в том же каталоге, где находится исходник программы, или в пути к модулю, по которым FPC ищет модули. | |
− | |||
== Unit precedence == | == Unit precedence == |
Revision as of 12:20, 1 September 2020
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
português (pt) │
русский (ru) │
Назад к Зарезервированным словам.
A Unit
- это файл исходного кода (или двоичный, скомпилированный из этого файла), который был написан с использованием языка программирования Pascal и разработан как отдельный модуль в Приложении или Объектном модуле. Слово Unit
- это зарезервированное слово.
Назначение
Модуль может использоваться там, где функциональность должна быть предоставлена прикладной программе или другим модулям. Он позволяет писать код, который выполняет эту функцию один раз и может использоваться во многих местах. Это может снизить вероятность ошибок и увеличить повторное использование кода.
Двоичный модуль может использоваться, когда автор модуля желает предоставить определенные функции для использования в программе языка Паскаль, но не желает предоставлять исходный код, который выполняет эти функции.
Модули также использовались в более старых версиях Паскаля, когда на компьютерах с ограниченными ресурсами было необходимо иметь возможность загружать подпрограммы по мере необходимости, а не хранить каждую подпрограмму исполняемой программы в памяти все время.
Модуль, которому требуется доступ, например, процедуры и типы данных в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе uses
(но связывание выполняется без необходимости писать make-файл, как в C).
Модуль также можно использовать для объявления серии глобальных констант или переменных для использования всем приложением без фактического содержания исполняемого кода. Это похоже на ключевое слово common
в языке программирования Fortran.
Формат
Модуль задается с помощью ключевого слова unit
, за которым следует идентификатор модуля. Идентификатор модуля (в следующем примере имя модуля - «minimalunit») должен соответствовать имени файла, в котором он записан. Минимальный рабочий пример (который ничего не делает):
unit minimalunit;
interface
// здесь функционал, которые модуль публикует открыто
implementation
// здесь идет реализация предлагаемого функционала и,
// возможно, внутреннего функционала (видимого только внутри модуля)
end.
где часть после раздела interface
соответствует public
-части других языков и раздел implementation
делает это для private
.
Более продвинутая базовая структура:
unit advancedunit;
interface
implementation
initialization
// здесь может быть размещен код,
// который выполняется при загрузке модуля
finalization
// код, выполняемый по окончании программы
end.
Необязательные разделы initialization
и finalization
могут следовать за кодом, который выполняется в начале/конце программы.
Подробный пример модуля
Пошаговый пример:
unit randomunit;
// этот модуль что-то делает
// public - - - - - - - - - - - - - - - - - - - - - - - - -
interface
type
// тип TRandomNumber становится видимым глобально,
// поскольку он где-то подключен (в операторе uses)
TRandomNumber = integer;
// конечно, возможны блоки const и var, также
// список сигнатур процедур/функций делает
// их доступными вовне модуля
function getRandomNumber(): TRandomNumber;
// реализация функции/процедуры
// не должна находиться в разделе interface
// private - - - - - - - - - - - - - - - - - - - - - - - - -
implementation
var
// var разделе private
// => может изменяться только внутри этого модуля
chosenRandomNumber: TRandomNumber;
function getRandomNumber(): TRandomNumber;
begin
// возвращаем значение
getRandomNumber := chosenRandomNumber;
end;
// раздел initialization - это часть, выполняемая
// при загрузке/включении модуля
initialization
begin
// выбираем наше случайное число
chosenRandomNumber := 3;
// выбранное броском игральной кости,
// гарантированно случайное
end;
// finalization запускается по окончанию программы
finalization
begin
// этот модуль говорит "пока" по завершению программы
writeln('пока');
end;
end.
Чтобы подключить модуль, просто используйте оператор uses
.
program chooseNextCandidate;
uses
// подключение модуля
randomunit;
begin
writeln('следующий кандидат: №. ' + getRandomNumber());
end.
При компиляции FPC проверяет эту программу на зависимости модулей. Он должен быть в состоянии найти модуль "randomunit".
Самый простой способ удовлетворить это - иметь модуль, имя которого совпадает с именем файла, в котором он записан (добавление .pas - это нормально и приветствуется). Файл модуля может находиться в том же каталоге, где находится исходник программы, или в пути к модулю, по которым FPC ищет модули.
Unit precedence
When multiple units are described in a use clause, conflicts can occur with identifiers (procedures, types, functions etc.) that have the same name in multiple units. In FreePascal, the last unit “wins” and provides the code for the unit.
If you want to achieve a different behavior, you can explicitly prepend unitname.identifier to specify the unit you want to use, or reorder the units. The former is often the clearest option.
unit interestCalculations;
interface
type
basisType = currency;
implementation
end.
Specifying the unit of declaration explicitly:
program interestCalculator;
uses
interestCalculations;
type
// we already loaded a declaration of "basisType"
// from the interestCalculations unit, but we're
// re-declaring it here again ("shadowing")
basisType = extended;
var
// last declaration wins: originalCapital is an extended
originalCapital: basisType;
// specify a scope to use the declaration valid there
monthlyMargin: interestCalculations.basisType;
begin
end.
Note, the interestCalculations unit will still perform its own calculations with its own basisType (here currency
). You can only alter (“shadow”) declarations in the current scope (and descending).
See also
- “Unit scope” in the “reference guide” (FPC HTML documentation)
- “Compiling a unit” in the “users's guide” (FPC HTML documentation)
- § “Units” in the WikiBook “Pascal Programming”