- OpenTofu 语言
- 表达式
- 算术和逻辑运算符
算术和逻辑运算符
运算符是一种类型的表达式,它转换或组合一个或多个其他表达式。运算符要么以某种方式组合两个值以产生第三个结果值,要么转换单个给定值以产生单个结果。
作用于两个值的运算符在两个值之间放置一个运算符符号,类似于数学符号: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
,如果a
为true
则返回false
。
OpenTofu 没有用于 "异或" 运算的运算符。如果您知道两个运算符都是布尔值,那么异或等效于 !=
("不等于") 运算符。
OpenTofu 中的逻辑运算符不会短路,这意味着 var.foo || var.foo.bar
如果 var.foo
为 null
会产生错误消息,因为 var.foo
和 var.foo.bar
都会被计算。