В языке «1С:Предприятия» не использовались функциональные типы.
Теперь в языке «Элемента» существуют функциональные типы. Функциональный тип – это тип, значениями которого являются методы. Функциональные типы позволяют хранить методы в переменных, передавать их в другие методы как аргументы и возвращать как результат.
Зачем нужны функциональные типы? Их появление обусловлено тем, что язык «Элемента» стремится максимальным образом типизировать все элементы программы и прикладного решения.
Так, например, в языке «1С:Предприятия» обработчик события являлся просто строкой, содержащей имя процедуры. Если параметры этой процедуры не соответствовали тому, что ожидает платформа, то обнаружить это можно было только в момент выполнения программы.
Теперь в языке «Элемента» обработчик события – это значение функционального типа, как правило, ссылка на существующий метод. Компилятор знает, какие параметры должны быть переданы в этот метод, и контролирует их правильность еще на этапе написания кода.
Другой случай – когда требуется типизация функциональным типом, это передача одного метода в другой метод. Например, в языке «1С:Предприятия» такая ситуация возникала с описаниями оповещения:
Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Подобрать номенклатуру в документ?", РежимДиалогаВопрос.ДаНет);
Здесь в процедуру ПоказатьВопрос() передается, грубо говоря, имя процедуры, которая должна быть выполнена после интерактивного ответа на вопрос.
В языке «Элемента» в таких случаях используются значения функционального типа. Например, в методе Мультимедиа.СканироватьШтрихкоды():
Мультимедиа.СканироватьШтрихкоды(
"Просканируйте товары чтобы добавить их в заказ",
ВидШтрихкода.Двумерный,
(штрихкод) -> ОбработатьШтрихкод(штрихкод)
)
Здесь третьим параметром передается метод ОбработатьШтрихкод(), который будет вызван при сканировании.
подробнее
Документация:
Имя функционального типа содержит типы параметров и возвращаемого значения, разделенные символом лямбда-операции ->.
Ниже приведены примеры описания значений функционального типа:
знч Результат: (Число, Число)->Строка
знч Результат: (Число, Число)->Строка?
знч Результат: (Число?)->Строка|Число
знч Результат: ()->Строка
знч Результат: (Строка)->ничто
Функциональный тип может являться частью составного типа. В этом случае имя функционального типа должно быть заключено в скобки, иначе все, что следует за лямбда-операцией ->, будет считаться составным типом результата. Например:
знч Результат: ((Число)->Строка)?
знч Результат: ((Число)->Строка)|Булево
Значения функционального типа могут записываться двумя способами:
(Строка1, Строка2) -> Строка1.Длина() < Строка2.Длина()
&СравнитьНаМеньше
Обратите внимание на разницу в написании имени функционального типа и лямбда-выражении:
В имени функционального типа не рекомендуется обрамлять пробелами лямбда-операцию ->:
(Число)->Число //Правильно
(Число) -> Число //Неправильно
В лямбда-выражении, наоборот, рекомендуется обрамлять пробелами лямбда-операцию ->:
x -> x + 1 //Правильно
x->x + 1 //Неправильно