Groovy закрытия - Отсутствует собственность - PullRequest
0 голосов
/ 14 февраля 2019

Попытка изучить Groovy замыкания, прежде чем писать jenkins pipe в виде скрипта.

Ниже кода:

def scores = [72,29,32,44,56]

def analyse(closure){
    closure(scores)
}

def firstScore(array){
    return array[0]
}

analyse(firstScore)

выдает ошибку:

groovy.lang.MissingPropertyException: No such property: firstScore for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)

Как устранить эту ошибку?

1 Ответ

0 голосов
/ 14 февраля 2019

Вы видите эту ошибку, потому что 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 на конвейерный код.

...