Примеры использования функциональных типов
Хранение метода в переменной
Значение функционального типа можно присвоить переменной и использовать его в дальнейшем. Например, это может быть лямбда-выражение, вычисляющее длину строки:
знч МетодДлина = (СтрокаТекста: Строка) -> СтрокаТекста.Длина()
...
пер ДлинаСтр оки = МетодДлина("моя строка")
Также это может быть ссылка на метод, в данном случае на метод ПолучитьДлину():
метод Пример()
знч МетодДлина = &ПолучитьДлину
...
пер ДлинаСтроки = МетодДлина("моя строка")
...
;
метод ПолучитьДлину(СтрокаТекста: Строка): Число
возврат СтрокаТекста.Длина()
;
Ссылка на системный метод
Вы можете ссылаться не только на собственные методы, но и на системные. Например, можно сослаться на метод Строка.Длина()
:
знч МетодДлина = &Строка.Длина
...
пер ДлинаСтроки = МетодДлина("моя строка")
Вызов системного метода с параметром функционального типа
Некоторые системные методы имеют параметры функционального типа.
Например, метод Массив<тип-элемента>.СортироватьПо()
имеет первый параметр, в который вы должны передать свое выражение. Это выражение должно вернуть то свойство элемента массива, по которому массив нужно отсортировать.
Пример использования этого метода выглядит следующим образом. Массив студентов, каждый из которых представлен структурой Студент
, сортируется по полю Оценка
этой структуры:
структура Студент
знч Фамилия: Строка
знч Оценка: Число
;
метод Пример()
знч МассивСтудентов = [новый Студент("Иванов", 5),
новый Студент("Савинская", 4),
новый Студент("Сидорова", 5),
новый Студент("Булатов", 3),
новый Студент("Кузнецова", 5)]
МассивСтудентов.СортироватьПо(ПарСтудент -> ПарСтудент.Оценка)
;
Передача метода в другой метод
Например, в метод приходят две строки (ПерваяСтрока, ВтораяСтрока), которые нужно сравнить между собой. Для выполнения сравнения вызывается метод СравнитьСтроки(), в котором описан алгоритм сравнения:
метод Пример()
пер Результат = СравнитьСтроки(ПерваяСтрока, ВтораяСтрока)
;
метод СравнитьСтроки(Первая: Строка, Вторая: Строка): Булево
возврат Первая.Длина() < Вто рая.Длина()
;
1. Использование лямбда-выражения
Предположим, нужно использовать разные алгоритмы сравнения, а не один и тот же. Тогда можно в метод СравнитьСтроки() добавить третий параметр функционального типа, в который передавать тот алгоритм сравнения, который нужен в данный момент:
метод Пример()
пер Результат = Срав нитьСтроки(
ПерваяСтрока,
ВтораяСтрока,
(Строка1, Строка2) -> Строка1.Длина() < Строка2.Длина()
)
;
метод СравнитьСтроки(
Первая: Строка,
Вторая: Строка,
Сравнить: (Строка, Строка)->Булево
): Булево
возврат Сравнить(Первая, Вторая)
;
Здесь в вызове метода СравнитьСтроки() написано лямбда-выражение:
(Строка1, Строка2) -> Строка1.Длина() < Строка2.Длина()