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

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

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

&МойМетод
&Выбрать(Массив<Товар>, Число)

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

// 3-й аргумент — ссылка на метод
Скрипт(1, 5, &МойМетод)

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

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

где

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

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

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

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

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

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

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

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

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

&имя-метода

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

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

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

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

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

Примеры:

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

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

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

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

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

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

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

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

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

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

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

Примеры:

метод тестГлобальныйКонтекст()
&ОбщийМодуль1.Метод1(Строка) // (Строка)->Число
;

метод тестЛокальнаяПеременная()
пер Массив1 = <Число>[]
пер добавить = &Массив1.Добавить // (Число)->Булево

добавить(1) // Добавляет в массив
;

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

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

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

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

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

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

Примеры:

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

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

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

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

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

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

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

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

Примеры:

метод тест()
знч НовыйСтрока1 = &Строка.новый // (Байты)->Строка
знч НовыйСтрока2 = &Строка.новый(Байты) // (Байты)->Строка
;

Примеры

См. также