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

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

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

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

// 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 = &Строка.новый(Байты) // (Байты)->Строка
;