Арифметические и логические операторы
Оператор — это тип выражения, который преобразует или объединяет одно или несколько других выражений. Операторы либо каким-либо образом объединяют два значения, чтобы получить третье результирующее значение, либо преобразуют одно заданное значение, чтобы получить один результат.
Операторы, работающие с двумя значениями, располагают символ оператора между этими значениями, как в математической записи: 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в противном случае.
Логические операторы
Все логические операторы ожидают логические значения и возвращают логические значения.
-
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 используют короткое замыкание: например, var.foo == null || var.foo.bar == 1 не вызовет сообщение об ошибке, если var.foo равно null, поскольку var.foo.bar не вычисляется.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.11/language/expressions/operators/