2016-10-10 4 views
1

Я бриллиант/Groovy newb, и я просматриваю какой-то уже существующий код.Как работает возврат в этом случае Grails?

Это выглядит следующим образом:

def update(Long id, Long version) { 
     def skateBoardSkillsInstance = SkateBoardSkills.get(id) 
     if (!skateBoardSkillsInstance) { 
      flash.message = message(code: 'default.not.found.message', args: [message(code: 'skateBoardSkills.label', default: 'SkateBoardSkills'), id]) 
      redirect(action: "list") 
      return 
     } 

     if (version != null) { 
      if (skateBoardSkillsInstance.version > version) { 
       skateBoardSkillsInstance.errors.rejectValue("version", "default.optimistic.locking.failure", 
          [message(code: 'skateBoardSkills.label', default: 'SkateBoardSkills')] as Object[], 
          "Another user has updated this SkateBoardSkills while you were editing") 
       render(view: "edit", model: [skateBoardSkillsInstance: skateBoardSkillsInstance]) 
       return 
      } 
     } 

     skateBoardSkillsInstance.properties = params 

     if (!skateBoardSkillsInstance.save(flush: true)) { 
      render(view: "edit", model: [skateBoardSkillsInstance: skateBoardSkillsInstance]) 
      return 
     } 

     flash.message = message(code: 'default.updated.message', args: [message(code: 'skateBoardSkills.label', default: 'SkateBoardSkills'), skateBoardSkillsInstance.id]) 
     redirect(action: "show", id: skateBoardSkillsInstance.id) 
    } 

Неожиданностью для меня было, когда я проследил до первого возвращения. Кажется, он выполняет возврат, а затем я буду в следующем, если. Почему он не вернулся?

[Изменить] Я привел пример более подробно.

ОК, при ближайшем рассмотрении (и ранее в тот же день) более точное описание того, что я вижу, это. Я отслеживаю условие «если». Это оценено. Если условие ложно, отладчик пропускает блок, но останавливается в операторе return внутри блока. Очень смущает. Был ли блок пропущен или не так ли? Я попытаюсь положить некоторые точки останова внутри блока. В случае, когда оператор «if» равен true, он выполняет блок и, кажется, возвращается ... однако есть два шага, которые не отображаются. Точка выполнения исчезает. Это означает, что я должен дважды нажать F8, а затем он вернется. Подозреваю, что это какая-то магия Гроувия. Что-то получает от системы.

+0

Если условие было выполнено, оно было сделано, и все, что вы проследите, ошибочно –

+0

Конечно, возможно, но не кажется вероятным. Если бы я отслеживал код, который не соответствовал двоичному, все могло бы произойти, как если бы я видел значения, которые явно неправильны, или я увижу точки останова или шаги, появляющиеся на пустых строках. Я буду держать это в курсе, но я думаю, что это, вероятно, то, что я не получаю от Groovy и ключевого слова return. – user447607

+0

Какую IDE вы используете? Решение может различаться между различными IDE. – Rotem

ответ

1

Это не связано с возвратом в Groovy. Основная причина для вашей ситуации - плохая синхронизация между кодом, который вы используете в режиме отладки, и обновлениями кода IDE в каталоге сборки. Это выглядит странно, но есть некоторые хорошие методы для его решения (хотя он не покрывает 100% синхронизации вашей кодовой строки). Изменения в коде между различными прогонами вашего кода не полностью скомпилированы в каталог сборки, и небольшие изменения в каталогах сборки вызывают такое поведение. Самый простой способ решить это путем обеспечения полной полной сборки вашего кода, и это может быть сделано путем удаления вашего каталога «build» и повторного запуска программы в режиме отладки. Если это не помогает, попробуйте обновить зависимости проекта до повторного запуска приложения.

+0

Очищено от командной строки. Re-RAN. Тот же вопрос. – user447607

+0

Что вы используете IDE? Что такое версия Groovy? Вы работаете с Grails? Каков строительный инструмент, с которым вы работаете? (Gradle/Maven)? – Rotem

+0

IntelliJ IDEA 2016.2.4. как указано в комментариях. Groovy Версия: 2.4.7 JVM: 1.8.0_101 – user447607

Смежные вопросы