Как использовать интерполяцию String в многострочной строке Groovy?

В Groovy у меня есть многострочная строка, определенная с помощью ''', в которой мне нужно использовать интерполяцию, чтобы заменить некоторые другие переменные.

При всех моих усилиях я не могу заставить его работать - я полагаю, мне нужно бежать от чего-то, чего мне не хватает.

Вот пример кода:

def cretanFood = "Dakos" 
def mexicanFood = "Tacos"
def bestRestaurant = ''' 
${mexicanFood} & ${cretanFood}
'''
print bestRestaurant

На данный момент это выдает:

${mexicanFood} & ${cretanFood}

хотя я бы явно ожидал:

Tacos & Dakos 

(Примечание - я бы предпочел не конкатенировать строки)

Ответ 1

В Groovy одинарные кавычки используются для создания неизменяемых строк, точно так же, как Java делает с двойными кавычками.

Когда вы используете двойные кавычки в Groovy, вы указываете во время выполнения ваше намерение создать изменяемую строку String или Groovy String (короткое замыкание в GString). Вы можете использовать переменную интерполяцию с изменяемыми строками, иначе вы можете оставить ее в виде обычной простой строки Java.

Такое поведение распространяется на многострочные версии String; использование тройных одинарных кавычек создает неизменяемую многострочную строку, тогда как тройные двойные кавычки создают Groovy String.

Ответ 2

Вместо использования ''' для GString или multi-line string используйте """

def cretanFood     = "Dakos"  
def mexicanFood    = "Tacos"
def bestRestaurant = """${mexicanFood} & ${cretanFood}"""
print bestRestaurant​

GString заключенный в ''', не сможет разрешить placeholder - $. Более подробную информацию вы можете найти в Groovy Documentation под заголовком String и String Summary Table block.

Ответ 3

Также может быть хорошей идеей добавить переменные из тройных кавычек и просто объединить их с содержимым. Примерно так для случаев, когда у вас сложный контент внутри кавычек:

def bestRestaurant = mexicanFood + """ & """ + cretanFood

Так как ваш случай довольно прост, это должно сделать и это:

def bestRestaurant = mexicanFood + " & " + cretanFood