Хобрук: Ваш путь к мастерству в программировании

Groovy: Как установить свойство/поле/def из метода в скрипте groovy?

Вопрос

Учитывая простой скрипт (не класс!), как вы устанавливаете значение свойства/поля, которое находится вне метода?

Пример

Следующий код не работает должным образом:

def hi;

def setMyVariable() {
    hi = "hello world!"
}

setMyVariable()
assert hi == "hello world!"    //fails
println hi                     //prints null

Неудачные попытки

Я пробовал много вещей, в том числе следующие, которые все потерпели неудачу

...

def setMyVariable() {
    this.hi = "hello world!"
}

...

public void setMyVariable() {
    hi = "hello world!"
}

...

public String hi;
public void setMyVariable() {
    this.hi = "hello world!";
}

Резюме

Каков самый простой способ установить переменную, которая является внешней по отношению к объявлению метода? Единственное, что я могу заставить работать, это следующее. Должен быть более простой способ!

def hi;

def setMyVariable() {
    this.binding.setVariable("hi", "hello world!")
}

setMyVariable()

println this.binding.getVariable("hi")
assert this.binding.getVariable("hi") == "hello world!"  //passes
assert hi == "hello world!"  //fails
19.12.2011

Ответы:


1

В Groovy 1.8.x вы можете сделать это:

@groovy.transform.Field def hi

Аннотация переменной, используемая для изменения области действия переменной в скрипте, начиная с метода run скрипта и заканчивая на уровне класса для скрипта.

19.12.2011
  • Это звучит как хороший путь. Однако, когда я импортирую groovy.transform.Field, я получаю сообщение об ошибке, что его невозможно найти. Я искал на Jarvana и, похоже, находится в банке groovy-all. Но, видимо, это не так. Я использую Groovy 2.0. Может он в другой банке? 19.12.2011
  • импорт также не работает, когда я использую groovy-all-1.8.4.jar :( 19.12.2011
  • Я также попытался добавить каждую банку под groovy-1.8.4/lib в путь к классам. Нет игральных костей. Кто-нибудь на самом деле получил это работает в сценарии ?? Я думал, что это лучший ответ, но я не могу заставить его работать... 19.12.2011
  • Странно. У меня работает с groovy-1.8.0 и groovy-2.0.0-beta-1. Что-то не так с вашей IDE? 19.12.2011
  • Я запускаю из командной строки (через ant task: <groovy src="PostProcess.groovy" classpath="${classpath.groovy}" /> 19.12.2011

  • 2

    Вы можете назначить анонимную функцию переменной вместо определения метода:

    def hi
    
    def setMyVariable = {
        hi = "hello world!"
    }
    
    setMyVariable()
    assert hi == 'hello world!'
    
    19.12.2011
  • просто. Мне это нравится... Я обнаружил, что часто в Groovy лучше/проще использовать замыкание, чем метод 19.12.2011

  • 3

    Взгляните на эту страницу документа Groovy:

    Когда вы определяете переменную в сценарии, она всегда является локальной. Но методы не являются частью этой области. Таким образом, определение метода с использованием разных переменных, как если бы они были атрибутами, а затем определение этих переменных обычным образом в скрипте приводит к проблемам.

    В этом случае вы должны сделать hi частью привязки (проще было бы не использовать def на самом деле, так что это будет автоматически частью привязки).

    19.12.2011
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.