在文档或他们的错误数据库中,两位作者似乎更喜欢这样写出表达式:
var.a != "" ? var.a : "default-a"
Run Code Online (Sandbox Code Playgroud)
该值被明确测试为不等于空字符串,然后相应地进行二进制选择。
然而,这也有效吗?
var.a ? var.a : "default-a"
Run Code Online (Sandbox Code Playgroud)
我没有发现它以任何方式明确说明。
Mar*_*ins 10
处理像这样的类型转换总是在语言设计中进行权衡,不同的语言在这里做出不同的妥协。
特别是对于 Terraform 的语言,其理念是“显式优于隐式”:理想情况下,不熟悉配置甚至可能不熟悉 Terraform 本身的人可以读取 Terraform 配置并很好地猜测它是什么意味着,无需记住很多隐式转换规则。
话虽如此,Terraform确实具有从字符串到布尔值的自动转换,但不会将空字符串转换为 false。相反,字符串值"true"
和分别"false"
映射到true
和false
,而任何其他字符串都会产生转换错误。
转换那些特定字符串值的余量主要是由向后兼容性动机:事先对terraform 0.12,有是没有布尔类型,因此包含这些值的字符串为表示布尔值的唯一方法。
当测试一个字符串是否为空,Terraform要求,要明确写出为var.string == ""
或var.string != ""
使意图是明确和清晰的给读者。
(我是从问题链接的文档的作者之一,也是从问题链接的评论的作者。在撰写本文时,我在 HashiCorp 从事 Terraform 工作。)
在 Terraform 0.12 之前,Terraform 在幕后使用类型强制对布尔值和整数进行了一些稍微有趣的处理,因为它在技术上仅支持字符串、列表和映射。
所以如果你做这样的事情:
variable "foo" {
default = "true"
}
output "truthiness" {
value = "${var.foo ? var.foo : "default-foo" }"
}
Run Code Online (Sandbox Code Playgroud)
那么你可以期待以下输出:
$ terraform apply
Using temporary credentials from master-read-only profile...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
truthiness = true
$ TF_VAR_foo=false terraform apply
Using temporary credentials from master-read-only profile...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
truthiness = default-foo
Run Code Online (Sandbox Code Playgroud)
这甚至适用于0
and 1
:
$ TF_VAR_foo=1 terraform apply
Using temporary credentials from master-read-only profile...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
truthiness = 1
$ TF_VAR_foo=0 terraform apply
Using temporary credentials from master-read-only profile...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
truthiness = default-foo
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试使用 Terraform 无法将其强制转换为布尔值的字符串,则它无法解析并会出错:
$ TF_VAR_foo="" terraform apply
Using temporary credentials from master-read-only profile...
Error: output.truthiness: __builtin_StringToBool: strconv.ParseBool: parsing "": invalid syntax in:
${var.foo ? var.foo : "default-foo" }
$ TF_VAR_foo="bar" terraform apply
Using temporary credentials from master-read-only profile...
Error: output.truthiness: __builtin_StringToBool: strconv.ParseBool: parsing "bar": invalid syntax in:
${var.foo ? var.foo : "default-foo" }
$ TF_VAR_foo=2 terraform apply
Using temporary credentials from master-read-only profile...
Error: output.truthiness: __builtin_StringToBool: strconv.ParseBool: parsing "2": invalid syntax in:
${var.foo ? var.foo : "default-foo" }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8225 次 |
最近记录: |