在 IntelliJ 中评估返回值的表达式

Posted

技术标签:

【中文标题】在 IntelliJ 中评估返回值的表达式【英文标题】:Evaluate expression on return value in IntelliJ 【发布时间】:2021-12-22 10:15:01 【问题描述】:

当我在 IntelliJ 调试器中右键单击返回值并选择“评估表达式”时,没有任何反应。

然后我必须切换到另一个堆栈帧并再次返回以使 Evaluate Expression 再次工作。

这是 Scala 代码。

如何评估引用返回值的表达式?调试器中的返回值名称不是合法标识符。

【问题讨论】:

请在youtrack.jetbrains.com/newIssue?project=IDEA报告错误。 @CrazyCoder 完成:youtrack.jetbrains.com/issue/IDEA-282255 【参考方案1】:

在调试器中单击“返回值”并不清楚您的意思。

如果您在特定行上设置了断点,则该线程的执行将在该行执行之前停止。但是 Scala 不会将函数或块的返回值分配给任何特定的名称,因此不清楚“调试器中的返回值的名称”指的是什么。

如果您使用推荐的隐式返回样式,

def repeatUppercase(base: String, count: Int = 3): String = 
  val baseUpper = base.toUpperCase
  val parts = List.fill(count)(baseUpper)
  parts.mkString

并且你在块的最后一行放置了一个断点,然后你的调试器将显示名称basecountbaseUpperparts,以及它们的值,当它停在那里时。如果将表达式 parts.mkString 粘贴到评估窗口中,它将评估表达式。如果您随后在调试器中前进,则返回值将被分配给在调用范围内分配给它的任何名称(除非调用范围丢弃返回值或匿名使用它)。

另一方面,如果你使用显式返回样式,

def repeatUppercase(base: String, count: Int = 3): String = 
  val baseUpper = base.toUpperCase
  val parts = List.fill(count)(baseUpper)
  return parts.mkString

那么你不能在 expression 求值器中计算 statement return parts.mkString,因为语句不是表达式! (在函数定义之外,return 语句在语法上也是无效的。)

【讨论】:

另请注意,Scala 中的 return 与 Java 中的含义不同,因此不应实际使用。 将最终表达式粘贴到评估对话框中有效,但它会重新执行表达式。如果它是一个没有副作用的纯函数表达式,例如parts.mkString,这是安全的,但如果表达式需要很长时间重新评估,则可能会导致性能问题。所以我想在这种情况下,建议重构最后一行 - 如果它是可编辑的,而不是第三方库 - 首先将表达式的结果存储到 val 然后只返回 @ 987654332@.

以上是关于在 IntelliJ 中评估返回值的表达式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA语言中 有返回值的方法和无返回值的方法有啥区别啊 请举例子说明!!

练习_使用Lambda表达式无参数无返回值的练习练习_使用Lambda表达式有参数有返回值的练习

directive ngChange

空参数值的 s-s-rS 表达式返回 #Error

Lua中返回值的丢失问题

C语言中表达式的返回值是啥,返回到哪里?跟return有关?