terraform - terraform 中的非空字符串是否真实?
问题描述
在文档或他们的错误数据库中,两位作者似乎都更喜欢这样写出表达式:
var.a != "" ? var.a : "default-a"
该值被显式测试为不等于空字符串,然后相应地进行二进制选择。
然而,这也有效吗?
var.a ? var.a : "default-a"
无论哪种方式,我都没有发现它明确说明。
解决方案
处理这样的类型转换始终是语言设计中的权衡,不同的语言在这里做出不同的妥协。
特别是对于 Terraform 的语言,其哲学是“显式胜于隐式”:理想情况下,不熟悉配置甚至可能不熟悉 Terraform 本身的人可以阅读 Terraform 配置并很好地猜测它是什么意味着,不需要记住很多隐式转换规则。
话虽如此,Terraform确实具有从字符串到布尔值的自动转换,但不会将空字符串转换为 false。相反,字符串值"true"
和"false"
映射到true
和false
分别和任何其他字符串都会产生转换错误。
允许转换这些特定的字符串值主要是出于向后兼容性:在 Terraform 0.12 之前,没有布尔类型,因此包含这些值的字符串是表示布尔值的唯一方法。
在测试字符串是否为空时,Terraform 要求将其明确写出,var.string == ""
以便var.string != ""
读者可以清楚地了解其意图。
(我是与问题相关的文档的作者之一,也是与问题相关的评论的作者。在撰写本文时,我在 HashiCorp 从事 Terraform 工作。)
推荐阅读
- sql - 将表中具有多个值的列中的字符串拆分为单独的行
- linux - 如何将多个文件直接下载、解压缩和传输到 s3 存储桶中?
- python - 这个 Python Coderbyte 函数是如何工作的?
- mysql - Zend Framework:如何从选择/加入中查询
- c# - 从 MatchEvaluator 委托调用的方法中返回一个 out 参数值?
- scala - Scala:如何正确解析 0~FFFF 范围内的十六进制值,确保我总是以 16 位结束,因为每个位都有自己的价值?
- mysql - 选择指定年份的结果
- azure-active-directory - Azure AD B2C 注册和登录是否可以重定向到自己的 URL,而不是 Microsoft 提供的 URL?
- node.js - 是否有某种与 Node.js 可以处理多少长轮询并发请求相关的 AWS 设置?
- haskell - Haskell 类型记录语法