Jaka jest różnica między ciągami znaków w pojedynczych lub podwójnych cudzysłowach w Groovy?

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

Czy jest jakaś różnica? Lub po prostu javascript do wprowadzania 'i "łatwiejszego w łańcuchach?

Freewind
źródło

Odpowiedzi:

148

Pojedyncze cudzysłowy to standardowy ciąg Java

Podwójne cudzysłowy to ciąg znaków, który można utworzyć za pomocą szablonu, który zwróci ciąg GString, jeśli jest utworzony na podstawie szablonu, lub standardowy ciąg języka Java. Na przykład:

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

Jeśli spróbujesz utworzyć szablony za pomocą ciągów znaków w pojedynczych cudzysłowach, nic to nie da, więc:

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

Warto również przeczytać link podany przez julkiewicza w ich odpowiedzi (szczególnie część o GStrings nie będąca Stringami w 2/3 drogi w dół.

tim_yates
źródło
6
Dobra uwaga, że ​​GString nie jest Stringiem. Staje się to problematyczne w przypadku niepowodzenia porównań równości między GString i String, mimo że zawierają te same znaki. To jest coś, na co musisz się właśnie nauczyć, szczególnie podczas odwoływania się do kluczy String / GString w mapach.
Steven,
19

Rozumiem, że ciąg znaków w podwójnych cudzysłowach może zawierać osadzone odniesienia do zmiennych i innych wyrażeń. Na przykład: "Hello $name", "Hello ${some-expression-here}". W tym przypadku GStringzostanie utworzony egzemplarz a zamiast zwykłego String. Z drugiej strony ciągi w apostrofach nie obsługują tej składni i zawsze dają w wyniku zwykły String. Więcej na ten temat tutaj:

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

julx
źródło