Как мне получить доступ ко всем полям импортированного объекта? - PullRequest
0 голосов
/ 10 апреля 2020
$ cat foo.libsonnet
{
    local foo = 99,
    bar: [ foo, 101 ]
}
$ cat baz.jsonnet
{
    local foo = import 'foo.libsonnet',
    baz: [foo.foo, foo.bar]
}
$ jsonnet baz.jsonnet
RUNTIME ERROR: field does not exist: foo
        baz.jsonnet:3:11-18     thunk <array_element>
        baz.jsonnet:3:10-28     object <anonymous>
        During manifestation

В этом примере легко получить доступ к bar полю foo. Есть ли способ для baz.jsonnet получить доступ к местным жителям foo.libsonnet?

Если ответ отрицательный, как мне реализовать foo и baz, чтобы я мог получить доступ к полю foo foo.libsonnet в foo.libsonnet, а также в baz.jsonnet?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Есть ли способ для baz.jso nnet получить доступ к местным жителям foo.libso nnet?

Нет. Местные жители, ну, в общем, местные. Это просто имена значений, доступных в некоторой лексической области. В частности, локальные объекты могут быть доступны только непосредственно в определении объекта.

Если вы хотите получить доступ к значению извне объекта, оно не должно быть локальным - вместо этого используйте поле. Если вы не хотите, чтобы он отображался при манифестации объекта, вы можете использовать скрытое поле, например:

$ cat foo.libsonnet
{
    foo:: 99, // double colon indicates that the field is hidden
    bar: [ self.foo, 101 ]
}
$ cat baz.jsonnet
{
    local foo = import 'foo.libsonnet',
    baz: [foo.foo, foo.bar]
}
$ jsonnet baz.jsonnet
{
   "baz": [
      99,
      [
         99,
         101
      ]
   ]
}
$ jsonnet foo.libsonnet
{
   "bar": [
      99,
      101
   ]
}
0 голосов
/ 10 апреля 2020

Я придумал это:

$ cat foo.libsonnet
{
    foo_parameters: {
        foo: 98
    },

    foo_objects: {
        local foo = $.foo_parameters,

        bar: [ foo.foo, 101 ]
    }
}
$ cat baz.jsonnet
{
    local foo = import 'foo.libsonnet',
    baz: [foo.foo_parameters.foo, foo.foo_objects.bar]
}
$ jsonnet baz.jsonnet
{
   "baz": [
      98,
      [
         98,
         101
      ]
   ]
}

Это по сути тот же вопрос и ответ.

...