Как использовать локальные переменные в массивах?

Я хочу написать функцию, которая возвращает массив. Массив содержит объекты, некоторые из которых должны повторно использовать определенный объект (metadata в этом примере). Этот объект зависит от параметра функции, и его повторение будет немного громоздким.

Я попробовал это:

local fn(name) = [
    local metadata = { name: name };
    { metadata: metadata, value: "foo" },
    { metadata: metadata, value: "bar" },
];

fn("blub")

К сожалению, я получаю эту ошибку:

STATIC ERROR: example.jsonnet:4:17-24: Unknown variable: metadata

Я ожидаю, что metadata также доступен в рамках второго пункта. Есть ли способ решить эту проблему, не повторяя metadata а без функции вернуть объект?

2 ответа

Когда у тебя есть local foo = expr1; expr2, foo определяется только в expr2, Итак, в приведенном вами примере metadata виден только в первом элементе массива. А местный это просто выражение. Вы можете использовать его в любом месте кода, где ожидается выражение, например 42 + (local x = 17 - 3; x + 4), local в Jsonnet является аналогом let ... in ... от Haskell/Ocaml и т. д.

Решение состоит в том, чтобы определить metadata для всего выражения массива, как в ответе ОП.

Я только что увидел, что документация действительно дает ответ на этот вопрос:

local fn(name) =
    local metadata = { name: name };
    [
        { metadata: metadata, value: "foo" },
        { metadata: metadata, value: "bar" },
    ];

fn("blub")
Другие вопросы по тегам