# Изменения в функциях

# Именованный массив для безымянных аргументов

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

Функция Фн(а, б, ...арг)
{
}

Фн(1, 2, 3, 4)       # арг будет содержать @[3, 4]

В этом примере в массив арг будут попадать все аргументы по порядку кроме первого и второго. Имя такого параметра может быть любым. Если у функции объявлен параметр с ..., то переменной Параметры в такой функции не будет.

# Значения параметров по умолчанию

Параметрам функции можно установить значения по умолчанию, написав = <выражение> после их имени. При вызове функции задавать значения таким параметрам не обязательно. Параметры со значениями по умолчанию должны идти последними в списке параметров функции:

Функция Фн(а, б, в = "x", г = @[1, 2, 3])
{
}

Фн(1, 2, "y")        # в получит значение "y"
                     # г - значение по умолчанию

Выражения для значений по умолчанию могут быть произвольными (например, содержать вызов другой функции). Кроме того, они вычисляются каждый раз при вызове функции (например, массив г будет создаваться заново при каждом вызове Фн).

# Функции как значения

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

Функция Фн(а, б)
{
   Вернуть а + б
}

перем п = Фн
п(1, 2)              # вернет 3

Кроме того, функции имеют свойства и методы, например

Функция Фн(а, б)
{
   Вернуть а + б
}

Фн.Имя               # строка "Фн"

Как и раньше, функции можно перегружать, т.е. объявлять несколько функций с одинаковым именем, но разным количеством параметров. Перегрузки функции можно получить с помощью свойства Перегрузки, а метод ЕстьПерегрузка позволяет узнать, существует ли такая перегрузка функции, которая может принять определенные аргументы:

Функция Фн(а, б)
{
   Вернуть а + б
}

Фн.ЕстьПерегрузка(1, 2)       # true
Фн.ЕстьПерегрузка(1, 2, 3)    # false

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

Функция Фн()
{
   Вернуть 1
}

перем п = Фн      # п будет равно 1, поскольку функция
                  # Фн автоматически вызвалась; получить
                  # ссылку на функцию Фн невозможно

Такое поведение необходимо для сохранения обратной совместимости.