Как использовать локальные переменные в массивах? - PullRequest
0 голосов
/ 06 июля 2018

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

0 голосов
/ 07 июля 2018

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

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

0 голосов
/ 06 июля 2018

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

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

fn("blub")
...