Вы видите эту ошибку, потому что firstScore
- это метод, а не замыкание в вашем примере кода.Вы можете либо изменить firstScore
определение от метода к закрытию, например
def firstScore = { array ->
return array[0]
}
, либо использовать оператор указателя метода Groovy , который преобразует метод в замыкание.В этом случае вам придется вызывать метод analyze
следующим образом:
analyze(this.&firstScore)
Кроме этого, ваш скрипт Groovy все равно не будет работать.Вы пытаетесь получить доступ к scores
в методе analyze
.Вы должны знать, что любой метод, определенный в скрипте, автоматически превращается в метод уровня класса (каждый скрипт Groovy компилируется в класс, который расширяет класс groovy.lang.Script
).Все остальные выражения и операторы, которые вы определяете в теле скрипта Groovy, являются частью метода Script.run()
и находятся в локальной области видимости.Поэтому, когда метод Script.analyze()
будет вызван, он будет жаловаться на несуществующее свойство scores
, поскольку scores
находится в локальной области действия Script.run()
метода.Чтобы исправить это, вы можете пометить переменную scores
аннотацией @groovy.transform.Field
, которая преобразует локальную переменную в свойство уровня класса - в этом случае к scores
можно обратиться из любого метода.
Ниже вы можете найтипример курируемого скрипта:
import groovy.transform.Field
@Field
def scores = [72,29,32,44,56]
def analyse(closure){
closure(scores)
}
def firstScore(array){
return array[0]
}
println analyse(this.&firstScore)
Вывод:
72
И последнее, но не менее важное.Прочтите «Лучшие практики для масштабируемого конвейерного кода» пост в блоге внимательно.Это объясняет лучшие практики в написании кода конвейера Jenkins.Кроме того, вам необходимо учитывать тот факт, что конвейерный код выполняется в режиме Groovy CPS, который имеет ряд ограничений .Их знание поможет вам решить проблемы, с которыми вы непременно столкнетесь после перехода с Groovy на конвейерный код.