Spec-Zone.ru › OpenTofu 1.12

Сплат-выражения

Сплат-выражение позволяет более кратко записать распространённую операцию, которую иначе можно было бы выполнить с помощью выражения for.

Если var.list — это список объектов, у каждого из которых есть атрибут id, список идентификаторов можно получить с помощью следующего выражения for:

Блок кода
[for o in var.list : o.id]

Это эквивалентно следующему сплат-выражению:

Блок кода
var.list[*].id

Специальный символ [*] перебирает все элементы списка слева от него и извлекает из каждого атрибут, имя которого указано справа. Сплат-выражение также можно использовать для доступа к атрибутам и индексам сложных типов в списках, добавляя последовательность операций справа от символа:

Блок кода
var.list[*].interfaces[0].name

Приведённое выше выражение эквивалентно следующему выражению for:

Блок кода
[for o in var.list : o.interfaces[0].name]

Сплат-выражения с отображениями​

Описанные выше шаблоны сплат-выражений применимы только к спискам, множествам и кортежам. Чтобы получить аналогичный результат для значения типа «отображение» или объекта, необходимо использовать выражения for.

Ресурсы, в которых используется аргумент for_each, представлены в выражениях в виде отображения объектов, поэтому для таких ресурсов нельзя использовать сплат-выражения. Дополнительные сведения см. в разделе Ссылки на экземпляры ресурсов.

Одиночные значения как списки​

При применении сплат-выражений к значениям, которые не являются списками, множествами или кортежами, они ведут себя особым образом.

Если значение не равно null, сплат-выражение преобразует его в список из одного элемента или, точнее, в кортеж из одного элемента. Если значение равно null, сплат-выражение возвращает пустой кортеж.

Это особое поведение может быть полезно для модулей, принимающих необязательные входные переменные, значение по умолчанию которых — null, что означает отсутствие значения. Благодаря этому модуль может адаптировать значение переменной для языковых возможностей OpenTofu, предназначенных для работы с коллекциями. Например:

Блок кода
variable "website_setting" {
  type = object({
    index_document = string
    error_document = string
  })
  default = null
}

resource "aws_s3_bucket" "example" {
  # ...

  dynamic "website" {
    for_each = var.website_setting[*]
    content {
      index_document = website.value.index_document
      error_document = website.value.error_document
    }
  }
}

В приведённом выше примере используется блок dynamic, который создаёт ноль или более вложенных блоков на основе значения коллекции. Входная переменная var.website_setting определена как одиночный объект, который может иметь значение null, поэтому в выражении for_each блока dynamic используется [*], чтобы при заданном вызывающим модуль аргументе website создавался один блок, а если аргумент оставлен равным null — ни одного.

Такое особое поведение сплат-выражений может быть непонятно читателю, не знакомому с ними, поэтому мы рекомендуем использовать его только в аргументах for_each и аналогичных случаях, когда контекст подразумевает работу с коллекцией. В противном случае смысл выражения может быть неясен будущим читателям.

Устаревшие сплат-выражения (только с атрибутами)​

В ранних версиях языка OpenTofu использовался немного другой вариант сплат-выражений, который OpenTofu продолжает поддерживать для обратной совместимости. Этот старый вариант менее полезен, чем описанная выше современная форма, поэтому мы не рекомендуем использовать его в новых конфигурациях.

В устаревших сплат-выражениях «только с атрибутами» используется последовательность .* вместо [*]:

Блок кода
var.list.*.interfaces[0].name

Эта форма имеет незначительное отличие в поведении и эквивалентна следующему выражению for:

Блок кода
[for o in var.list : o.interfaces][0].name

Обратите внимание: в сплат-выражении только с атрибутами операция индексации [0] применяется к результату перебора, а не выполняется в ходе самого перебора. Для каждого элемента входных данных выполняется только поиск атрибутов. Это ограничение вызывало затруднения у некоторых пользователей ранних версий OpenTofu, поэтому мы рекомендуем всегда использовать новые сплат-выражения с [*], обеспечивающие более последовательное поведение.

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.12/language/expressions/splat/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API