在这个Grails案例中,return是如何工作的?

在这个Grails案例中,return是如何工作的?,grails,groovy,Grails,Groovy,我是Grails/Groovy新手,正在跟踪一些预先存在的代码 看起来是这样的: def update(Long id, Long version) { def skateBoardSkillsInstance = SkateBoardSkills.get(id) if (!skateBoardSkillsInstance) { flash.message = message(code: 'default.not.found.message

我是Grails/Groovy新手,正在跟踪一些预先存在的代码

看起来是这样的:

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”语句为true,则执行块并返回。。。然而,有两个步骤没有出现。执行点消失。这意味着我必须按F8两次,然后它返回。不过,我怀疑这是一个非常棒的魔术。系统正在把一些东西放进去

它与Groovy中的返回无关。出现这种情况的主要原因是,在调试模式下运行的代码与生成目录中的IDE代码更新之间的同步错误。 这看起来很奇怪,但是有一些很好的技术可以解决它(尽管它并没有涵盖代码行的100%同步)。 在不同的代码运行之间,代码中的更改并没有完全编译到构建目录中,而构建目录中的小更改会导致这种行为。 解决这个问题的最简单方法是强制执行代码的新完整构建,可以通过删除“构建”目录并在调试模式下重新运行程序来完成。
如果这没有帮助,请在重新运行应用程序之前尝试刷新项目依赖项。

如果满足了条件,它确实满足了,并且无论您使用什么方法跟踪它都是可能的,但似乎不太可能。如果我在跟踪与二进制不匹配的代码,就会出现一些情况,比如我会看到明显错误的值,或者我会看到断点或步骤显示在空行上。我会对此持开放态度,但我认为这可能是Groovy和return关键字中我不了解的东西?不同IDEs之间的解决方案可能有所不同。IntelliJ IDEA 2016.2.4。另一个怀疑的原因是,该方法自首次在此机器上编译以来尚未改变。从来没有什么不同。你使用的IDE是什么?什么是Groovy版本?你在使用Grails吗?您正在使用的构建工具是什么?(gradle/maven)?IntelliJ IDEA 2016.2.4。如评论中所述。Groovy版本:2.4.7 JVM:1.8.0 e这一原因可能是由于一些不同的参数,因此所有这些因素都可能使问题得到解决,因为solvedIt是一个旧的Grails项目。Grails版本:2.5.4GreatSelectionofIDEA。你在用Gradle吗?圣杯?Grails2.4?还是更大?