Использование groovy .transform.Field для определения другого поля - PullRequest
0 голосов
/ 27 февраля 2020

Я пишу сценарий Groovy, в котором мне нужно использовать некоторые из моих полей внутри замыканий. Ниже приведен очень упрощенный пример, демонстрирующий мою проблему.

#!/usr/bin/env groovy

import groovy.transform.Field

@Field def first = 'one'
assert first == 'one'

Пока все хорошо. В моем случае это будет String, представляющая имя сервера. Затем я изменяю это значение «по умолчанию» из параметров командной строки - используя CliBuilder () - может быть что-то вроде:

first = 'two'
assert first == 'two'

Это все еще работает. Теперь мне нужно создать новое поле из приведенного выше:

@Field def second = first
assert second == 'two'

В моем случае это будет HTTPBuilder (), с которым я буду делать вызовы REST.

Сбой:

Assertion failed: 

assert second == 'two'
       |      |
       'one'  false

Есть ли способ заставить это работать?

Неудачная попытка как-то обойти это. Используя посредника, что-то вроде:

def intermediary = first
assert intermediary == 'two'
@Field def second = intermediary

Сбой с:

Caught: java.lang.reflect.InvocationTargetException
java.lang.reflect.InvocationTargetException
    at something.main(something)
Caused by: groovy.lang.MissingPropertyException: No such property: intermediary for class: something
    at something.<init>(something)
    ... 1 more

1 Ответ

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

аннотация @Filed объявляет член класса сценария, и любые другие команды сценария будут go в script.run() метод

, например, сценарий

import groovy.transform.Field

@Field def first = 'one'
first = 'two'
@Field def second = first
assert second == 'two' // <<<---- fails because second=='one'

будет преобразован примерно для этого класса во время компиляции скрипта:

class scriptXXXX{
    Object first
    Object second

    scriptXXXX(){ // constructor
        first = 'one'
        second = first
    }

    void run(){ // script body
        first = 'two'
        assert second == 'two' : null    
    }
}

Вы можете увидеть это в groovyconsole, нажав Ctrl+T

enter image description here


как вариант вы можете разделить объявление поля и инициализацию:

@Field def first = 'one'
@Field def second
first = 'two'
second = first
assert second == 'two'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...