Ссылки на методы
Значение функционального типа может передаваться с помощью ссылки на метод, которая передает уже существующий метод и записывается с помощью символа &, названия метода и аргументов, например:
&МойМетод
&Выбрать(Массив<Товар>, Число)
Так во встроенном языке может выглядеть ссылка на метод как аргумент при передаче в другой метод:
// 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 = &Строка.новый(Байты) // (Байты)->Строка ;