跳至主要内容

算术和逻辑运算符

运算符是一种类型的表达式,它转换或组合一个或多个其他表达式。运算符要么以某种方式组合两个值以产生第三个结果值,要么转换单个给定值以产生单个结果。

作用于两个值的运算符在两个值之间放置一个运算符符号,类似于数学符号:1 + 2。作用于单个值的运算符在该值之前放置一个运算符符号,例如 !true

OpenTofu 语言有一组用于算术和逻辑的运算符,它们类似于 JavaScript 或 Ruby 等编程语言中的运算符。

当在一个表达式中一起使用多个运算符时,它们按以下运算顺序进行计算

  1. !, - (乘以 -1)
  2. *, /, %
  3. +, - (减法)
  4. >, >=, <, <=
  5. ==, !=
  6. &&
  7. ||

使用括号覆盖默认的运算顺序。如果没有括号,更高级别将首先计算,因此 OpenTofu 将把 1 + 2 * 3 解释为 1 + (2 * 3),而不是 (1 + 2) * 3

不同的运算符可以被归类为几个具有相似行为的不同组,如下所述。每组运算符都希望其给定值为特定类型。OpenTofu 会尝试自动将值转换为所需的类型,或者如果自动转换不可能,则会生成错误消息。

算术运算符

所有算术运算符都期望数字值,并产生数字值作为结果

  • a + b 返回将 ab 相加的结果。
  • a - b 返回将 ba 中减去的结果。
  • a * b 返回 ab 相乘的结果。
  • a / b 返回将 a 除以 b 的结果。
  • a % b 返回将 a 除以 b 的余数。此运算符通常仅在与整数一起使用时才有用。
  • -a 返回将 a 乘以 -1 的结果。

OpenTofu 支持一些其他不太常见的数值运算作为 函数。例如,可以使用 pow 函数 计算指数。

相等运算符

两个相等运算符都接受任意类型的两个值,并产生布尔值作为结果。

  • a == b 返回 true 如果 ab 具有相同的类型和相同的值,否则返回 false
  • a != ba == 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 如果 abtrue,如果两者都为 false 则返回 false
  • a && b 返回 true 如果 ab 都为 true,如果其中一个为 false 则返回 false
  • !a 返回 true 如果 afalse,如果 atrue 则返回 false

OpenTofu 没有用于 "异或" 运算的运算符。如果您知道两个运算符都是布尔值,那么异或等效于 != ("不等于") 运算符。

OpenTofu 中的逻辑运算符不会短路,这意味着 var.foo || var.foo.bar 如果 var.foonull 会产生错误消息,因为 var.foovar.foo.bar 都会被计算。