Как использовать локальные переменные в массивах?
Я хочу написать функцию, которая возвращает массив. Массив содержит объекты, некоторые из которых должны повторно использовать определенный объект (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")