Привет!
У нас был вопрос в московской группе пользователей 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%});
}
}
Теперь код компилируется и работает так, как нам нужно.