首页 > 解决方案 > terraform 中的非空字符串是否真实?

问题描述

文档或他们的错误数据库中,两位作者似乎都更喜欢这样写出表达式:

var.a != "" ? var.a : "default-a"

该值被显式测试为不等于空字符串,然后相应地进行二进制选择。

然而,这也有效吗?

var.a ? var.a : "default-a"

无论哪种方式,我都没有发现它明确说明。

标签: terraform

解决方案


处理这样的类型转换始终是语言设计中的权衡,不同的语言在这里做出不同的妥协。

特别是对于 Terraform 的语言,其哲学是“显式胜于隐式”:理想情况下,不熟悉配置甚至可能不熟悉 Terraform 本身的人可以阅读 Terraform 配置并很好地猜测它是什么意味着,不需要记住很多隐式转换规则。

话虽如此,Terraform确实具有从字符串到布尔值的自动转换,但不会将空字符串转换为 false。相反,字符串值"true""false"映射到truefalse分别和任何其他字符串都会产生转换错误。

允许转换这些特定的字符串值主要是出于向后兼容性:在 Terraform 0.12 之前,没有布尔类型,因此包含这些值的字符串是表示布尔值的唯一方法。

在测试字符串是否为空时,Terraform 要求将其明确写出,var.string == ""以便var.string != ""读者可以清楚地了解其意图。


(我是与问题相关的文档的作者之一,也是与问题相关的评论的作者。在撰写本文时,我在 HashiCorp 从事 Terraform 工作。)


推荐阅读