Это на самом деле особенность базового синтаксиса Groovy. Groovy позволяет указывать параметры метода по имени (то есть <name>: <value>
) всякий раз, когда первый параметр метода объявляется как Map
. Важно отметить, что именованные параметры могут появляться в любой точке в списке argumemt, даже после так называемых позиционных параметров (то есть тех, которые объявлены после Map
в сигнатуре метода), и они будут помещены в виде записей вначальный Map
параметр. Подробнее см. Раздел Сочетание именованных и позиционных параметров в документации на языке Groovy .
Итак, метод Gradle filter
имеет сигнатуру
CopySpec filter(Map<String,?> properties, Class<? extends FilterReader> filterType)
Первый properties
параметр имеет тип Map
, поэтому этот метод можно вызывать с именованными параметрами. Кроме того, есть еще один позиционный параметр , filterType
. Таким образом, для вызова этого метода необходимо указать один параметр без имени, типа Class<? extends FilterReader>
, который будет использоваться для filterType
, и ноль или более именованных параметров, которые все будут помещены в карту properties
.
Если взять один из примеров из документации:
filter(HeadFilter, lines:25, skip:2)
будет означать, что filter
вызывается с
properties = [
lines: 25,
skip: 2
]
filterType = HeadFilter
Любой из следующих вызовов будет эквивалентен:
filter(lines:25, skip:2, HeadFilter)
filter(lines:25, HeadFilter, skip:2)
filter([lines:25, skip:2], HeadFilter)
Последний вызов здесь передает оба параметра позиционно (у вас нет для использования именованных параметров, когда первый параметр объявлен как Map
).
В сторону Примечание
Я заинтригован тем, почему использование expand
не работает - оно должно!