# Изменения в операторах

# Короткое замыкание в логических операторах

По умолчанию логические операторы не поддерживают т.н. короткое замыкание: если результат левого операнда && оказался false (либо true у ||), то правый операнд все равно вычисляется, хотя результат и так уже известен:

# в обоих выражениях будет вызвана функция Фн()

false && Фн()
true || Фн()

В новой версии языка можно включить короткое замыкание, если в начале файла написать директиву version 2:

version 2

# теперь функция Фн() вызываться не будет

false && Фн()
true || Фн()

Однако, директива действует сразу на весь файл, поэтому в старом коде ей нужно пользоваться с осторожностью.

# Оператор ...

Этот оператор заимствован из JavaScript (opens new window). Он "разворачивает" переданную последовательность элементов так, как будто бы элементы последовательности были написаны через запятую в этом месте кода:

перем м = @[1, 2]
Фн(...м)                   # работает так, как если бы
                           # было написано Фн(1, 2)
перем п = @[...м, 3, 4]    # аналогично @[1, 2, 3, 4]

Его можно применять к любым коллекциям и итераторам, при этом объекты обрабатываются особым образом:

  • если объект "разворачивается" внутри литерала объекта, то он рассматривается как список пар ключ-значение

  • иначе как массив; в этом случае ключами должны быть числа от 1 от N, а объект "развернется" в последовательность соответствующих им значений

# вариант 1
перем о = @{x: 1, y: 2}
перем п = @{...o, z: 3}    # @{x: 1, y: 2, z: 3}

# вариант 2
перем м = @{1: "x", 2: "y", 3: "z"}
перем п = @[...м]          # @["x", "y", "z"]

Оператор ... удобно применять для объединения нескольких коллекций в одну

перем а = @{x: 1, y: 2}
перем б = @{z: 3, w: 4}
перем в = @{...а, ...б}

для передачи заранее неизвестного количества аргументов в функцию:

Функция Фн1(...)
{
   Вернуть Фн2(10, ...Параметры)
}

и других подобных случаях.