В вашем примере 2 различных контекста использования.
1. Именованные параметры
В первом примере вы использовали именованные параметры Groovy . Следующий Groovy код:
print(abc: 1)
является эквивалентом
print([abc: 1])
Groovy использует карту для представления именованных аргументов, и эта конструкция доступна только при вызове метода. Вот почему, когда вы попытались присвоить abc : 1
переменной, компиляция завершилась с ошибкой.
2. Помеченные заявления
Второй пример, который использует замыкание, является примером помеченного оператора . Если вы отформатируете свой код, он будет выглядеть так:
def closure = { ->
abc:
return 1 // return is optional of course in this case. I added it to make the example more explicit
}
print closure() // prints 1
Имейте в виду, что метки не влияют на семантику кода, поэтому вы получаете 1
взамен. Метки присутствуют в абстрактном синтаксическом дереве, и их можно использовать для манипулирования кодом (например, Spock Framework использует метки, такие как given
, when
, then
, чтобы добавить определенное поведение в тест).