Перейти к основному содержимому

Ссылки на методы

Значение функционального типа может передаваться с помощью ссылки на метод, которая передает уже существующий метод и записывается с помощью символа &, имени метода и типов параметров (при их наличии). Например:

Ссылка на метод без параметров
метод МойМетод()
;

метод Скрипт()
пер Ссылка = &МойМетод
;
Ссылки на перегруженные методы с разным набором параметров
метод Выбрать(Массив: Массив<Строка>, Число: Число)
;

метод Выбрать(Массив: Массив<Строка>, От: Число, До: Число)
;

метод Скрипт()
пер Ссылка1 = &Выбрать(Массив<Строка>, Число)
пер Ссылка2 = &Выбрать(Массив<Строка>, Число, Число)
;

Ссылка на метод как аргумент при передаче в другой метод может выглядеть следующим образом:

метод Скрипт(А: Число)
// Второй аргумент для метода Реализация — ссылка на метод Квадрат()
пер Результат = Реализация(А, &Квадрат)
;

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

&имя-метода[(тип-параметра-1, ..., тип-параметра-N)]

Где:

  • & — символ ссылки на метод;
  • имя-метода — имя уже существующего метода, на который дается ссылка;
  • (тип-параметра-1, ..., тип-параметра-N) — список параметров, если они есть.

Так, в примере ниже, метод Скрипт() получает результат метода МойМетод(), в который как аргумент передается ссылка на метод Квадрат(), имеющий тип (Число)->Число и возводящий число в квадрат:

метод Квадрат(А: Число): Число
возврат А * А
;

метод МойМетод(А: Число, Формула: (Число)->Число): Число
возврат Формула(А)
;

метод Скрипт(А: Число)
пер Результат = МойМетод(А, &Квадрат)
;

Ниже описываются существующие виды ссылок на методы.

Ссылка на локальный метод

Создает ссылку на локальный метод (метод в этом же модуле). Результирующий функциональный тип имеет те же параметры, что и метод, и такой же тип возврата.

Краткий синтаксис:

&имя-метода

Полный синтаксис:

&имя-метода(тип-параметра-1, ..., тип-параметра-N)

Краткая форма может быть использована, если:

  • метод не имеет перегрузок,
  • функциональный тип может быть выведен из контекста.

Иначе необходимо использовать полную форму.

Примеры:

метод ДлинаСтроки(Текст: Строка): Число
возврат Текст.Длина()
;

метод Скрипт()
знч Длина1 = &ДлинаСтроки // Тип переменной (Строка)->Число
знч Длина2 = &ДлинаСтроки(Строка) // Тип переменной (Строка)->Число
;

Ссылка на метод экземпляра

Создает ссылку на метод экземпляра в указанной переменной. Результирующий функциональный тип имеет те же параметры, что и метод, и такой же тип возврата.

Краткий синтаксис:

&имя-переменной.имя-метода

Полный синтаксис:

&имя-переменной.имя-метода(тип-параметра-1, ..., тип-параметра-N)

Краткая форма может быть использована, если:

  • метод не имеет перегрузок,
  • функциональный тип может быть выведен из контекста.

Иначе необходимо использовать полную форму.

Примеры:

Ссылка на глобальный метод
// Некоторый глобальный метод, объявленный в модуле ПрикладныеМетоды
@Глобально
метод Рассчитать(Сумма: Число): Число
возврат (Сумма * 0.2).Округлить(2)
;

//////////////////////////////////////

метод ОбработкаПлатежа(): Число
// Получаем ссылку на глобальный метод расчета, объявленный в модуле ПрикладныеМетоды
пер Расчет = &ПрикладныеМетоды.Рассчитать // (Число)->Число
знч СуммаПлатежа = 10000
возврат Расчет(СуммаПлатежа) // 2000.00
;
Ссылка на локальный метод
метод УправлениеЗаказами()
пер Заказы = <Число>[]
пер РегистраторЗаказа = &Заказы.Добавить // (Число)->Булево

РегистраторЗаказа(50001)
РегистраторЗаказа(50002)

пер ПоискЗаказа = &Заказы.Содержит // (Число)->Число?
// Ищем конкретный заказ
знч НайденныйЗаказ = ПоискЗаказа(50001) // Истина
;

Ссылка на метод типа

Создает ссылку на метод типа. Результирующий функциональный тип имеет первым параметром параметр указанного типа, а далее — такие же параметры, что и метод, и такой же тип возврата.

Краткий синтаксис:

&имя-типа.имя-метода

Полный синтаксис:

&имя-типа.имя-метода(тип-параметра-1, ..., тип-параметра-N)

Примеры:

метод Ссылки(Строка: Строка)
знч Длина = &Строка.Длина // ()->Число
знч ВСтроку = &Число.ВСтроку(Число) // (Число, Число)->Строка
знч Добавить = &Массив<Число>.Добавить // (Массив<Число>, Число)->Булево
;

метод СортироватьСтроки(Массив: Массив<Строка>): Массив<Строка>
возврат Массив.Сортировать(&Строка.Сравнить(Строка))
;

Ссылка на конструктор

Создает ссылку на конструктор типа. Результирующий функциональный тип имеет те же параметры, что и конструктор, и конструируемый тип как тип возврата.

Краткий синтаксис:

&имя-типа.новый

Полный синтаксис:

&имя-типа.новый(тип-параметра-1, ..., тип-параметра-N)

Примеры:

метод Конструкторы()
знч КонструкторСтроки1 = &Строка.новый // (Байты, Кодировка|Строка)->Строка
знч КонструкторСтроки2 = &Строка.новый(Байты) // (Байты)->Строка
пер Строка = КонструкторСтроки1(Байты{d09fd180d0b8d0b2d0b5d1822c20d09cd0b8d18021}, Кодировка.Utf8) //"Привет, Мир!"
пер Строка2 = КонструкторСтроки2(Байты{d09fd180d0b8d0b2d0b5d1822c20d09cd0b8d18021}) //"Привет, Мир!"
;

Примеры

См. также