【问题标题】:How does return work in this Grails case?在这个 Grails 案例中,return 是如何工作的?
【发布时间】:2016-10-10 20:31:31
【问题描述】:

我是 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。为什么没有返回?

[编辑] 我已经把这个例子写得更详细了。

好的,经过仔细(以及当天早些时候)检查,我所看到的更准确的描述是这样的。我追溯到“如果”条件。是评估的。如果条件为假,调试器将跳过该块,但在该块内的 return 语句处停止。很混乱。是否跳过了该块?我会尝试在块内放置一些断点。在“if”语句为真的情况下,它会执行该块并且确实似乎返回了......但是有两个步骤没有出现。执行点消失。这意味着我必须按两次 F8 才能返回。怀疑这是一些 Groovy 魔法。系统正在将某些东西放入其中。

【问题讨论】:

  • 如果满足条件,它确实满足了,并且无论您使用什么追踪它都是错误的
  • 当然可能,但似乎不太可能。如果我正在跟踪与二进制文件不匹配的代码,就会发生一些事情,比如我会看到明显错误的值,或者我会看到断点或步骤出现在空行上。我会对此持开放态度,但我认为这可能是我对 Groovy 和 return 关键字不了解的地方。
  • 您使用的是什么 IDE?不同的 IDE 之间的解决方案可能会有所不同。
  • IntelliJ IDEA 2016.2.4.
  • 怀疑的另一个原因是,自从它首次在这台机器上编译以来,这种方法还没有改变。从未如此不同。

标签: grails groovy


【解决方案1】:

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

【讨论】:

  • 您使用的 IDE 是什么?什么是 Groovy 版本?你在使用 Grails 吗?您正在使用的构建工具是什么? (gradle/maven)?
  • IntelliJ IDEA 2016.2.4。如 cmets 中所述。 Groovy 版本:2.4.7 JVM:1.8.0_101
  • 这个原因可能是由于一些不同的参数所以可以一起完成图片来解决问题
  • 这是一个古老的 Grails 项目。 Grails 版本:2.5.4
  • IDEA 的绝佳选择。你在使用 Gradle 吗?圣杯?圣杯 2.4 ?还是更大?
猜你喜欢
  • 2010-11-06
  • 2021-10-05
  • 2017-11-26
  • 2021-10-14
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多