Синтаксис отображения Groovy spread operator с двоеточием

#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 пары, поэтому они, должно быть, подумали о том, чтобы сохранить его *: в виде содержимого карты : .