SIL: Как получить значение поля, если поле определено в массиве

Привет!

У нас был вопрос в московской группе пользователей Atlassian, как получить значение поля в SIL, если мы определяем имя поля в массиве.

Думаю, код объяснит лучше слов, что нам нужно сделать:

string [] keys = selectIssues("key = SCRUM-22");
string [] fields = {"my text field"};
for (string k in keys) {
    for (string field in fields) {
        runnerLog(k.#{field});
    }
}

Как Вы видите, я получаю ишью по JQL. Затем я определяю массив с именами полей. Затем я запускаю цикл по выбранным ишью. И для каждого ишью запускаю цикл по массиву с именами полей. И затем печатаю значение поля.

Если я попытаюсь скомпилировать код, то получу ошибку:

Ошибка вот в этой строке:

runnerLog(k.#{field});

SIL пытается найти поле с именем “field” (SIL не понимает, что мы то хотим, чтобы SIL “field” рассматривал как переменную, а не как имя поля) и в результате SIL не находит поля с именем “field” и бросает исключение.

Если мы заменим строчку на вот такую(явно укажем имя поля):

runnerLog(k.#{my text field});

Скрипт скомпилируется без ошибок и выдаст правильный результат. Значит ли это, что мы не можем передавать имена полей в массиве, а должны явно указывать имя поля? Но в этом случае наш код будет ужасен. Представим, что у нас 50 полей или нам нужно как-то динамически получать поля. Нет так не пойдет.

И в SIL есть возможность сделать все красиво!

В SIL есть символ %. Если вы поставите этот символ перед переменной и после, то SIL будет всегда трактовать эту переменную, как переменную. Этот символ нужен для неоднозначных ситуаций, как наша.

Давайте добавим этот символ:

runnerLog(k.#{%field%});

Вот полный код:

string [] keys = selectIssues("key = SCRUM-22");
string [] fields = {"my text field"};
for (string k in keys) {
    for (string field in fields) {
        runnerLog(k.#{%field%});
    }
}

Теперь код компилируется и работает так, как нам нужно.

Leave a Reply

%d bloggers like this: