【问题标题】:element => command in TerraformTerraform 中的 element => 命令
【发布时间】:2022-11-11 06:42:40
【问题描述】:

我在https://github.com/terraform-aws-modules/terraform-aws-efs/blob/master/examples/complete/main.tf#L58 中看到如下代码

  # Mount targets / security group
  mount_targets = { for k, v in toset(range(length(local.azs))) :
    element(local.azs, k) => { subnet_id = element(module.vpc.private_subnets, k) }
  }

我试图理解 => 在这里的含义。此命令还带有 for 循环、元素和 =>。 有人可以在这里解释一下吗?

【问题讨论】:

标签: terraform


【解决方案1】:

Lambda 表达式使用运算符符号 =,读作“goes to”。输入参数在运算符的左侧指定,语句/表达式在右侧指定。通常,lambda 表达式不直接用于查询语法,而是经常用于方法调用。查询表达式可能包含方法调用。

Lambda 表达式语法特点如下:

  • 这是一个没有名字的函数。

  • 没有修饰符,例如重载和覆盖。

  • 函数的主体应该包含一个表达式,而不是一个语句。

  • 可以包含对函数过程的调用,但不能包含对子过程的调用。

  • 返回语句不存在。

  • 函数返回的值只是函数体中包含的表达式的值。

  • End 函数语句不存在。

  • 参数必须具有指定的数据类型或被推断。

  • 不允许泛型参数。

  • 不允许可选和 ParamArray 参数。

  • Lambda 表达式为编译器提供简写,允许它发出分配给委托的方法。

编译器对 lambda 参数执行自动类型推断,这是一个关键优势。

【讨论】:

    【解决方案2】:

    在这种情况下,=> 符号不是一个独立的语言特性,而只是for expression 语法的一部分,结果将是一个映射。

    产生序列(具体来说是一个元组)的for 表达式具有以下一般形式:

    [
      for KEY_SYMBOL, VALUE_SYMBOL in SOURCE_COLLECTION : RESULT
      if CONDITION
    ]
    

    KEY_SYMBOL, 部分和 if CONDITION 部分都是可选的。)

    结果是对SOURCE_COLLECTION 的每个元素评估RESULT(一个表达式)产生的一系列值,其中CONDITION(另一个表达式)评估为true

    当结果是一个序列时,我们只需要指定一个结果表达式,但是当结果是一个映射(特别是一个对象)时,我们需要指定两个键值,因此映射表单具有附加部分,包括您要询问的 => 符号:

    {
      for KEY_SYMBOL, VALUE_SYMBOL in SOURCE_COLLECTION : KEY_RESULT => VALUE_RESULT
      if CONDITION
    }
    

    这里的原理是一样的,只是对于每个源元素 Terraform 都会评估KEY_RESULTVALUE_RESULT 以生成键/值对以插入到结果映射中。

    这里的=> 标记只是一些标点符号,以便Terraform 可以明确识别KEY_RESULT 的结束位置和VALUE_RESULT 的开始位置。除了作为映射结果for 表达式中的分隔符之外,它没有特殊含义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2018-10-15
      • 2022-12-19
      • 2019-01-23
      • 2016-10-17
      • 2021-12-20
      • 2019-06-03
      相关资源
      最近更新 更多