使用Groovysh作为Java REPL时的问题

时间:2015-03-12 16:18:58

标签: java groovy

正如这篇文章(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代码有什么不同的其他可能(角落)案例?

1 个答案:

答案 0 :(得分:3)

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}"''')

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