Список Groovy на карте не отображает все значения oop - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть этот код в Groovy;

def execution = []
def executor =[:]
for(loopcount=1;loopcount<4;loopcount++){
    executor.executor = 'jmeter'
    executor.scenario = 'scenario' + loopcount
    println executor.scenario
    executor.concurrency = 2
    execution.add(executor)
}
execution.each{
    println executor.scenario
}

Это список из трех карт, все те же, кроме приращений суффикса сценария. Я ожидаю;

scenario1
scenario2
scenario3
scenario1
scenario2
scenario3

Но я получаю;

scenario1
scenario2
scenario3
scenario3
scenario3
scenario3

Это определенно добавляет три разные карты в список, потому что команда .each возвращает три значения. И они определенно разные значения в executor.scenario, потому что println в l oop дает правильное количество '1, 2, 3'. Но почему они не остаются разными значениями в списке?

Я также пытался выполнить execute.pu sh (executor), но это дает те же результаты. Для контекста, это то, к чему я стремлюсь в конечном итоге;

---
execution:
- executor: "jmeter"
  scenario: "scenario1"
  concurrency: 2
- executor: "jmeter"
  scenario: "scenario2"
  concurrency: 2
- executor: "jmeter"
  scenario: "scenario3"
  concurrency: 2

И кроме подсчета сценариев, все остальное работает нормально.

1 Ответ

1 голос
/ 27 февраля 2020

проблема:

def execution = []
def executor =[:]
for(loopcount=1;loopcount<4;loopcount++){
    execution.add(executor) // <<-- this line adds the same variable to the list 4 times
}

, чтобы исправить это - объявите executor внутри for l oop

def execution = []
for(loopcount=1;loopcount<4;loopcount++){
    def executor =[:]       // <<-- creates a new object in a loop
    execution.add(executor) // <<-- adds new object to a list
}

, вероятно, чтобы сделать его более понятным, позвольте мне указать что [] и [:] означает:

def execution = new ArrayList()
for(loopcount=1;loopcount<4;loopcount++){
    def executor = new LinkedHashMap()
    execution.add(executor)
}

однако вы можете объявить переменную до l oop, но вы должны назначить в нее новый объект внутри l oop

def execution = []
def executor
for(loopcount=1;loopcount<4;loopcount++){
    executor = [:]
    execution.add(executor)times
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...