使用 Groovysh 作为 Java REPL 时的问题

Issues when using Groovysh as Java REPL

正如这个 post (Is there something like python's interactive REPL mode, but for Java?) 所示,我们可以将 groovysh 用于 Java REPL。

我有这段代码可以很好地编译 javac

    GroovyShell shell = new GroovyShell();
    shell.evaluate("println \"My name is ${name}\"");

然而,当我在 groovysh 中尝试 运行 这个命令时,我得到了错误。我必须使 ${name} 绕过错误。

这是为什么? Java 和 Groovy 代码有什么不同的其他可能(角落)情况?

Groovy 中的双引号字符串文字是 GStrings,它解释 ${...} 表达式并将其结果代入字符串。给定 Groovy 代码

shell.evaluate("println \"My name is ${name}\"")

Groovy 将尝试解析当前上下文中的 name 变量,并在找不到合适的定义时抛出异常。

如果你想按字面意思传递 ${...}(因此它由 GroovyShell 而不是当前的 Groovy 上下文解释)那么你要么需要转义美元签署或使用不受 ${...} 插值影响的其他 Groovy 字符串定界符之一(单引号、三重单引号或斜线):

shell.evaluate('println "My name is ${name}"')
shell.evaluate('''println "My dog's name is ${dogName}"''')

在单引号字符串中,您也不需要反斜杠双引号字符。