我是Grails / Groovy newb,我正在追踪一些预先存在的代码。
看起来像这样:
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)
}
令我惊讶的是,当我追溯到第一次回归时。它似乎执行返回,然后我在下一个if。为什么不回来?
[编辑]我让这个例子更加详细。
好的,一旦接近(在当天早些时候)检查,对我所看到的内容的更准确描述就是这个。我追溯到'如果'的条件。它被评估了。如果条件为false,则调试器会跳过块,但会在块内的return语句处停止。很混乱。块是跳过还是不是?我会尝试在块内放置一些断点。在'if'语句为真的情况下,它执行块并确实返回...但是有两个步骤没有显示。执行点消失。这意味着我必须两次击中F8然后它返回。怀疑这是一些Groovy魔法。系统正在放置一些东西。
答案 0 :(得分:1)
它与Groovy中的返回无关。您遇到的情况的主要原因是您在调试模式下运行的代码与构建目录中的IDE代码更新之间的同步错误。 这看起来很奇怪但是有一些很好的技术可以解决它(尽管它不能覆盖你代码行100%的同步)。 不同代码运行之间代码的更改不会完全编译到构建目录中,构建目录中的小更改会导致您拥有该行为。 解决这个问题的最简单方法是强制执行新的代码完整版本,可以通过删除“build”目录并在调试模式下重新运行程序来完成。 如果在重新运行应用程序之前没有帮助尝试刷新项目依赖项。