groovy отображает неожиданное зацикливание - PullRequest
0 голосов
/ 12 февраля 2020

Эти два кодовых блока почти идентичны, ожидаемые структуры данных должны быть одинаковыми.

slabels - это карта отсортированных значений даты и времени на ключах docker -tag. ind - это значение последовательного индекса, которое будет использоваться позже. dtags это карта, которая составляется здесь. properties - это карта составляемых карт.

Пример A

        def dtags = [:];
        slabels.each {
          ind ++
          dtags << ['lastModified': it.value]
          dtags << ['seq': ind]
          println it.key + ": " + dtags
          properties.put("$it.key", dtags)
        }
        println properties
Result: println it.key + ": " + dtags
1.30: [lastModified:2020-02-12T10:31:19.107+0000, seq:1]
1.29: [lastModified:2020-02-11T15:44:49.658+0000, seq:2]
1.28: [lastModified:2020-02-10T09:22:49.010+0000, seq:3]

Result: println properties
[1.30:[lastModified:2019-12-10T17:14:10.672+0000, seq:22],
1.29:[lastModified:2019-12-10T17:14:10.672+0000, seq:22],
1.28:[lastModified:2019-12-10T17:14:10.672+0000, seq:22]]

Здесь properties."$it.key" = dtags дает тот же результат.

Пример B

        def dtags = [:];
        slabels.each {
          ind ++
          dtags << ['lastModified': it.value]
          dtags << ['seq': ind]
          println it.key + ": " + dtags
          properties."$it.key" = ['lastModified': it.value, 'seq': ind]
        }
        println properties
Result: println it.key + ": " + dtags
1.30: [lastModified:2020-02-12T10:31:19.107+0000, seq:1]
1.29: [lastModified:2020-02-11T15:44:49.658+0000, seq:2]
1.28: [lastModified:2020-02-10T09:22:49.010+0000, seq:3]

Result: println properties
[1.30:[lastModified:2020-02-12T10:31:19.107+0000, seq:1],
1.29:[lastModified:2020-02-11T15:44:49.658+0000, seq:2],
1.28:[lastModified:2020-02-10T09:22:49.010+0000, seq:3]]

Обратите внимание, что результаты println it.key + ": " + dtags совпадают, но println properties отличаются. Для ясности желаемым результатом является пример B.

Если я определю dtags внутри l oop, то это решит проблему и даже может быть подсказкой.

Однако в пример A, dtags , кажется, используется дважды в одной и той же области видимости, что дает разные результаты. Короткий вопрос, что мне не хватает?

Заранее спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

Вы помещаете ссылку на dtags в свой properties в своем первом примере кода - поэтому последнее присвоение dtags является единственным оставшимся, и все properties одинаковы.

Трудно сказать, что является главной проблемой, которую нужно решить здесь (код очень запутанный), но я предполагаю, что вы получите больше идиотматического кода c, используя eachWithIndex / collect / ...

...