Конвейер показывает, как результат одного шага передаётся на следующий.
left |> right вычисляет левую часть один раз, сохраняет значение и передаёт
его вправо по единому чёткому правилу. Заполнитель _ указывает конкретную
позицию аргумента вызова, куда подставляется сохранённое значение.
Самодостаточный конвейер
Сохраните код в pipelines-placeholders.tpz:
function прибавить(значение: int, величина: int) -> int {
значение + величина
}
function умножить(слева: int, справа: int) -> int {
слева * справа
}
function равны(слева: int, справа: int) -> bool {
слева == справа
}
let результат = 5
|> прибавить(2)
|> умножить(_, 3)
let повторяется = результат |> равны(_, _)
print("{результат} {повторяется}")Проверьте и запустите файл:
topaz check pipelines-placeholders.tpz
topaz run pipelines-placeholders.tpzРезультат:
21 trueНа первом шаге заполнитель отсутствует, поэтому сохранённая 5 передаётся
первым аргументом: получается add(5, 2). На втором шаге позиция сохранённой 7
указана явно: multiply(7, 3). В последнем конвейере оба _ получают одно и
то же сохранённое значение 21, поэтому вызов эквивалентен equal(21, 21).
Левая часть не вычисляется повторно для второго заполнителя.
Четыре формы правой части
| Правая часть | Значение |
|---|---|
value |> call(other) | Передать value первым аргументом перед всеми явными позиционными, развёрнутыми и именованными аргументами |
value |> call(_, other) | Заменить каждый допустимый _ на value, не добавляя ещё один аргумент |
value |> callable | Вызвать вызываемый объект с единственным аргументом value |
value |> .field | Прочитать field у value |
Конвейеры связываются слева направо. Каждый шаг получает завершённый результат
предыдущего. Заполнитель относится к ближайшему содержащему его вызову.
Символ _ в шаблоне сопоставления, напротив, означает пропуск значения. Токен
одинаков, но область применения и назначение различаются.
В позициях аргументов одного вызова допускается один или несколько заполнителей.
Все они получают одно сохранённое левое значение. Если справа присутствует
хотя бы один допустимый _, замена имеет приоритет и дополнительная вставка
первого аргумента не выполняется.
Частая ошибка
Сам по себе _ не является значением. Его нельзя использовать в качестве всей
правой части, вызываемого объекта, имени члена или поля. Поместите его
в список аргументов того вызова, который должен получить значение конвейера.
Конструкция value |> ?.field не поддерживается. Используйте обычную
опциональную цепочку заранее или явную лямбду. Именованные аргументы и после
подстановки должны идти за позиционными и развёрнутыми. Если правая часть не
является вызовом, вызываемым значением или .field, проверка сообщает о
статической ошибке.
Конвейер не добавляет автоматическую передачу Result, частичное применение или
неявную асинхронность. Для Result используйте явный постфиксный ?, а для
ограниченной конкурентной работы — явный concurrent.
Приоритет описан в разделе Операторы и выражения, вызываемые значения — в Функции и обобщения, а этапы над коллекциями — в Коллекции и включения.