跳至主要内容

类型和值

表达式的结果是一个*值*。所有值都有一个*类型*,它决定了该值可以在哪里使用以及可以对其进行哪些转换。

类型

OpenTofu 语言使用以下类型表示其值

  • string: 一系列 Unicode 字符,表示某些文本,例如 "hello"
  • number: 一个数值。number 类型可以表示整数,例如 15,也可以表示分数,例如 6.283185
  • bool: 布尔值,要么是 true,要么是 falsebool 值可以在条件逻辑中使用。
  • list: 一系列值,例如 ["us-west-1a", "us-west-1c"]。列表中的元素由连续的整数标识,从零开始。
  • set: 一组唯一的值,这些值没有任何辅助标识符或顺序。
  • map: 一组由命名标签标识的值,例如 {name = "Mabel", age = 52}

字符串、数字和布尔值有时被称为*基本类型*。列表和集合是元组的形式。映射是对象的一种形式。元组和映射有时被称为*复杂类型*、*结构类型*或*集合类型*。请参阅 类型约束,以详细了解复杂类型。

最后,有一个特殊值*没有*类型

  • null: 表示*不存在*或*省略*的值。如果将资源的参数设置为 null,OpenTofu 的行为就像完全省略了它一样——它将使用该参数的默认值(如果有),或者在该参数为必需时引发错误。null 在条件表达式中最有用,因此您可以根据条件是否满足动态地省略参数。

字面量表达式

字面量表达式是指直接表示特定常数值的表达式。OpenTofu 为上面描述的每种值类型都有一种字面量表达式语法。

字符串

字符串通常由用双引号括起来的一系列 Unicode 字符表示,例如 "like this"。对于更复杂的字符串,还有一种“heredoc”语法。

字符串字面量是 OpenTofu 中最复杂的字面量表达式,并且有自己的文档页面。有关转义序列、heredoc 语法、插值和模板指令的信息,请参阅 字符串

数字

数字由没有引号的数字序列表示,这些数字序列可以包含或不包含小数点,例如 156.283185

布尔值

布尔值由没有引号的符号 truefalse 表示。

空值由没有引号的符号 null 表示。

列表/元组

列表/元组由一对方括号表示,方括号中包含用逗号分隔的值序列,例如 ["a", 15, true]

列表字面量可以拆分为多行以提高可读性,但始终需要在值之间用逗号分隔。最后一个值后面的逗号允许使用,但不强制要求。列表中的值可以是任意表达式。

映射/对象

映射/对象由一对大括号表示,大括号中包含一系列 <KEY> = <VALUE>

代码块
{
name = "John"
age = 52
}

键/值对可以用逗号或换行符分隔。

映射中的值可以是任意表达式。

映射中的键必须是字符串;如果它们是有效的 标识符,则可以不加引号,否则必须加引号。您可以通过将非字面量字符串表达式括在圆括号中,将它用作键,例如 (var.business_unit_tag_name) = "SRE"

索引和属性

可以使用方括号索引表示法访问列表/元组和映射/对象的元素,例如 local.list[3]。方括号内的表达式必须是列表和元组值的整数,或者映射和对象值的字符串。

具有有效标识符名称的映射/对象属性也可以使用点分隔的属性表示法访问,例如 local.object.attrname。在映射可能包含任意用户指定的键的情况下,建议仅使用方括号索引表示法 (local.map["keyname"])。

关于复杂类型的更多信息

在大多数情况下,列表和元组的行为相同,映射和对象也是如此。只要区别不重要,OpenTofu 文档就会交替使用这两对术语(历史上更喜欢使用“列表”和“映射”)。

但是,模块作者和提供者开发人员应该理解这些类似类型(以及相关的 set 类型)之间的区别,因为它们提供了不同的方式来限制输入变量和资源参数的允许值。

有关这些类型的完整详细信息(以及为什么区别通常并不重要的解释),请参阅 类型约束

类型转换

表达式最常用于设置资源和子模块参数的值。在这些情况下,参数具有预期的类型,并且给定的表达式必须生成该类型的 value。

在可能的情况下,OpenTofu 会自动将值从一种类型转换为另一种类型,以生成预期的类型。如果无法做到这一点,OpenTofu 将会产生类型不匹配错误,您必须使用更合适的表达式更新配置。

OpenTofu 会在需要时自动将数字和布尔值转换为字符串。它还会将字符串转换为数字或布尔值,只要字符串包含数字或布尔值的有效表示即可。

  • true 转换为 "true",反之亦然。
  • false 转换为 "false",反之亦然。
  • 15 转换为 "15",反之亦然。