компоненту это свойство понадобится первому.
Примером может стать графическая библиотека, в которой любая функция, вызываемая первой, должна предварительно провести настройку, учитывающую параметры дисплея. Автор библиотеки мог, конечно, потребовать, чтобы каждый клиент начинал работу с библиотекой с вызова функции настройки. Этот нюанс, в сущности, не решает проблему - чтобы справиться с ошибками, любая функция должна обнаруживать, не запущена ли она без настройки. Но если функции такие 'умные', то зачем что-то требовать от клиента, когда можно нужную функцию настройки вызывать самостоятельно.
Однократные процедуры решают эту проблему лучше:
check_setup is
-- Настроить терминал, если это еще не сделано.
once
terminal_setup -- Фактические действия по настройке.
end
Теперь каждая экранная функция должна начинаться с обращения к
Однократная процедура - это важный прием, упрощающий применение библиотек и других программных пакетов.
Параметры
Однократные процедуры и функции могут иметь параметры, необходимые, по определению, лишь при первом вызове.
Однократные функции, закрепление и универсальность
В этом разделе мы обсудим конкретную техническую проблему, поэтому при первом чтении книги его можно пропустить.
Однократные функции, тип которых не является встроенным, вносят потенциальную несовместимость с механизмом закрепления типов и универсальностью.
Начнем с универсальности. Пусть в родовом классе
f: G is once ... end
Рассмотрим пример ее использования:
character_example: EXAMPLE [CHARACTER]
...
print (character_example.f)
Пока все в порядке. Но если попытаться получить константу с другим родовым параметром:
integer_example: EXAMPLE [INTEGER]
...
print (integer_example.f + 1)
В последней инструкции мы складываем два числа. Первое значение, результат вызова
Проблема заключается в попытке разделения значения разными формами родового порождения, ожидающими значения, тип которого определяется родовым параметром. Аналогичная ситуация возникает и с закреплением типов. Представим себе класс
class B inherit A feature
attribute_of_B: INTEGER
end
Пусть
f: like Current is once create Result make end
и пусть первый вызов функции
a2 := a1.f
где
b2 := b1.f
где
print (b2.attribute_of_B)
попытается обратиться к несуществующему полю объекта