Groovy中使用单引号或双引号定义字符串有什么区别?

137
def a = "a string"
def b = 'another'

有什么区别吗?或只是像JavaScript一样让我们更容易地在字符串中输入'"

3个回答

197

单引号是标准的Java字符串。

双引号是可模板化字符串,如果经过模板化处理,则将返回GString;否则将返回标准的Java字符串。例如:

println 'hi'.class.name    // prints java.lang.String
println "hi".class.name    // prints java.lang.String

def a = 'Freewind'
println "hi $a"            // prints "hi Freewind"
println "hi $a".class.name // prints org.codehaus.groovy.runtime.GStringImpl

如果您尝试使用单引号字符串进行模板处理,它不会起任何作用,因此:

println 'hi $a'            // prints "hi $a"

此外,julx在他们的回答中提供的链接值得一读(特别是关于 GStrings 不是 String 的部分,在页面下方的 2/3 处)。


7
关于GString不是String的观点很有道理。这可能导致在比较包含相同字符的GString和String时出现equals比较失败的问题。特别是在引用映射中的String/GString键时,你必须学会注意这一点。 - Steven

23

据我了解,双引号字符串可以包含嵌入的变量和其他表达式。例如: "Hello $name", "Hello ${some-expression-here}"。在这种情况下,将实例化一个 GString 而不是常规的 String。另一方面,单引号字符串不支持此语法,并始终生成普通的 String。更多相关信息请参见:

http://docs.groovy-lang.org/latest/html/documentation/index.html#all-strings


1

我知道这是一个非常老的问题,但我想要添加一个警告。

虽然在Groovy中使用单引号(或三个单引号)确实可以防止插值,但如果您将单引号字符串传递给shell命令,则shell将执行参数替换,如果变量是环境变量。局部变量或参数将产生错误的替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接