#groovy
#groovy
Вопрос:
Мне интересно, почему этот синтаксис не согласуется для распространения списков и карт. Например, в этом коде
def list =[1,2,3]
def map =[a:1,b:2]
println "${[*list]}"
println "${[*:map]}"
список расширяется с помощью одного *, а карта с *:
Связано ли это с тем, как работает оператор распространения внутри? Поскольку я не видел никакого другого использования для *map construct (например, определение пустой карты с помощью [:] имеет смысл отличать ее от list ).
Комментарии:
1.
*:
это просто оператор, например*
, или?:
или… Это не связано с тем, как он работает внутри, это просто «имя» оператора для распространения карт
Ответ №1:
Оператор spread (*) используется для извлечения записей из коллекции и предоставления их в виде отдельных записей.
1. Элементы расширенного списка:
При использовании внутри литерала списка оператор spread действует так, как если бы содержимое элемента spread было встроено в список:
def items = [4,5] def list = [1,2,3,*items,6] assert list == [1,2,3,4,5,6]
Источник : http://docs.groovy-lang.org/latest/html/documentation/#_spread_list_elements
2. Элементы карты распространения:
Оператор spread map работает аналогично оператору spread list, но для карт. Это позволяет встроить содержимое карты в другой литерал карты, как в следующем примере:
def m1 = [c:3, d:4] def map = [a:1, b:2, *:m1] assert map == [a:1, b:2, c:3, d:4]
Источник : http://docs.groovy-lang.org/latest/html/documentation/#_spread_map_elements
Комментарии:
1. Я нахожу эквивалентный синтаксис
def map = [a:1, b:2] m1
более читаемым2. Да, я тоже, но просто @Vuk попросил
*:
значение, поэтому я привел ему пример.3. Спасибо за ответ. Я прочитал документацию, но вопрос заключался в том, почему один и тот же оператор в одном случае использует *, а в другом *: символ. Поскольку groovy стремится упростить вещи везде, где это возможно, думаю, для этого должна быть веская причина.
4. Ну, я не уверен, почему groovy creator сохранил его таким образом, но as
Map
представлен в видеkey:value
пары, поэтому они, должно быть, подумали о том, чтобы сохранить его*:
в виде содержимого карты:
.