Книга: «1С:Предприятие.Элемент». Возможности встроенного языка
Назад: Типы-одиночки
Дальше: Лямбда-выражения

Функциональные типы

В языке «1С:Предприятия» не использовались функциональные типы.

Теперь в языке «Элемента» существуют функциональные типы. Функциональный тип – это тип, значениями которого являются методы. Функциональные типы позволяют хранить методы в переменных, передавать их в другие методы как аргументы и возвращать как результат.

Зачем нужны функциональные типы? Их появление обусловлено тем, что язык «Элемента» стремится максимальным образом типизировать все элементы программы и прикладного решения.

Так, например, в языке «1С:Предприятия» обработчик события являлся просто строкой, содержащей имя процедуры. Если параметры этой процедуры не соответствовали тому, что ожидает платформа, то обнаружить это можно было только в момент выполнения программы.

Теперь в языке «Элемента» обработчик события – это значение функционального типа, как правило, ссылка на существующий метод. Компилятор знает, какие параметры должны быть переданы в этот метод, и контролирует их правильность еще на этапе написания кода.

Другой случай – когда требуется типизация функциональным типом, это передача одного метода в другой метод. Например, в языке «1С:Предприятия» такая ситуация возникала с описаниями оповещения:

Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект);

ПоказатьВопрос(Оповещение, "Подобрать номенклатуру в документ?", РежимДиалогаВопрос.ДаНет);

Здесь в процедуру ПоказатьВопрос() передается, грубо говоря, имя процедуры, которая должна быть выполнена после интерактивного ответа на вопрос.

В языке «Элемента» в таких случаях используются значения функционального типа. Например, в методе Мультимедиа.СканироватьШтрихкоды():

Мультимедиа.СканироватьШтрихкоды(

"Просканируйте товары чтобы добавить их в заказ",

ВидШтрихкода.Двумерный,

(штрихкод) -> ОбработатьШтрихкод(штрихкод)

)

Здесь третьим параметром передается метод ОбработатьШтрихкод(), который будет вызван при сканировании.

подробнее

Документация:

Имя функционального типа содержит типы параметров и возвращаемого значения, разделенные символом лямбда-операции ->.

Ниже приведены примеры описания значений функционального типа:

знч Результат: (Число, Число)->Строка

знч Результат: (Число, Число)->Строка?

знч Результат: (Число?)->Строка|Число

знч Результат: ()->Строка

знч Результат: (Строка)->ничто

Функциональный тип может являться частью составного типа. В этом случае имя функционального типа должно быть заключено в скобки, иначе все, что следует за лямбда-операцией ->, будет считаться составным типом результата. Например:

знч Результат: ((Число)->Строка)?

знч Результат: ((Число)->Строка)|Булево

Значения функционального типа могут записываться двумя способами:

(Строка1, Строка2) -> Строка1.Длина() < Строка2.Длина()

&СравнитьНаМеньше

Обратите внимание на разницу в написании имени функционального типа и лямбда-выражении:

В имени функционального типа не рекомендуется обрамлять пробелами лямбда-операцию ->:

(Число)->Число //Правильно

(Число) -> Число //Неправильно

В лямбда-выражении, наоборот, рекомендуется обрамлять пробелами лямбда-операцию ->:

x -> x + 1 //Правильно

x->x + 1 //Неправильно

Назад: Типы-одиночки
Дальше: Лямбда-выражения