Арифметические и логические операторы
Оператор — это тип выражения, который преобразует или объединяет одно или несколько других выражений. Операторы либо объединяют два значения определённым образом, чтобы получить третье значение-результат, либо преобразуют заданное значение, чтобы получить одно результирующее значение.
Операторы, работающие с двумя значениями, размещают символ оператора между этими значениями, как в математической записи: 1 + 2. Операторы, работающие только с одним значением, размещают символ оператора перед этим значением, например !true.
В языке OpenTofu есть набор арифметических и логических операторов, похожих на операторы в таких языках программирования, как JavaScript или Ruby.
Если в выражении используется несколько операторов, они вычисляются в следующем порядке:
-
!,-(умножение на-1) -
*,/,% -
+,-(вычитание) -
>,>=,<,<= -
==,!= &&||
Используйте скобки, чтобы изменить порядок вычислений по умолчанию. Без скобок сначала вычисляются операторы с более высоким приоритетом, поэтому OpenTofu интерпретирует 1 + 2 * 3 как 1 + (2 * 3), а не как (1 + 2) * 3.
Операторы можно разделить на несколько групп со схожим поведением, описанных ниже. Для каждой группы операторов входные значения должны иметь определённый тип. OpenTofu попытается автоматически преобразовать значения к требуемому типу или выведет сообщение об ошибке, если автоматическое преобразование невозможно.
Арифметические операторы
Все арифметические операторы принимают числовые значения и возвращают числовые результаты:
-
a + bвозвращает результат сложенияaиb. -
a - bвозвращает результат вычитанияbизa. -
a * bвозвращает результат умноженияaнаb. -
a / bвозвращает результат деленияaнаb. -
a % bвозвращает остаток от деленияaнаb. Этот оператор обычно полезен только при работе с целыми числами. -
-aвозвращает результат умноженияaна-1.
Некоторые другие, менее распространённые числовые операции доступны в OpenTofu в виде функций. Например, вычислять степени можно с помощью функции pow.
Операторы равенства
Оба оператора равенства принимают два значения любого типа и возвращают логические значения.
-
a == bвозвращаетtrue, еслиaиbимеют одинаковые тип и значение, иfalseв противном случае. -
a != b— противоположностьa == b.
Поскольку для определения равенства операторы равенства требуют, чтобы оба аргумента имели в точности одинаковый тип, мы рекомендуем использовать эти операторы только со значениями примитивных типов или применять явные функции преобразования типов, чтобы указать, какой тип следует использовать для сравнения.
Сравнение структурных типов может привести к неожиданным результатам, если вы не уверены в типах каждого из аргументов. Например, может показаться, что var.list == [] вернёт true, если var.list — пустой список, но [] на самом деле создаёт значение типа tuple([]), поэтому эти два значения никогда не совпадут. В такой ситуации зачастую понятнее написать length(var.list) == 0.
Операторы сравнения
Все операторы сравнения принимают числовые значения и возвращают логические значения.
-
a < bвозвращаетtrue, еслиaменьшеb, иfalseв противном случае. -
a <= bвозвращаетtrue, еслиaменьше или равноb, иfalseв противном случае. -
a > bвозвращаетtrue, еслиaбольшеb, иfalseв противном случае. -
a >= bвозвращаетtrue, еслиaбольше или равноb, иfalseв противном случае.
Логические операторы
Все логические операторы принимают значения bool и возвращают значения bool.
-
a || bвозвращаетtrue, еслиaилиbравноtrue, иfalse, если оба значения равныfalse. -
a && bвозвращаетtrue, если иa, иbравныtrue, иfalse, если хотя бы одно из них равноfalse. -
!aвозвращаетtrue, еслиaравноfalse, иfalse, еслиaравноtrue.
В OpenTofu нет оператора для операции «исключающее ИЛИ». Если вы знаете, что оба операнда имеют логический тип, то исключающее ИЛИ эквивалентно оператору != («не равно»).
В OpenTofu v1.10 и более поздних версиях логические операторы OpenTofu работают с вычислением по короткой схеме: это означает, что var.foo == null || var.foo.bar == 1 не приведёт к сообщению об ошибке, если var.foo равно null, поскольку var.foo.bar не вычисляется. Любое пропущенное выражение по-прежнему проходит статическую проверку, например проверку того, существует ли блок variable "foo", на который ссылается var.foo.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.12/language/expressions/operators/