Если вы хотите создать DSL-подобную цепочку команд, вы можете воспользоваться передачей аргументов без скобок и / или точечных обозначений.Самая близкая форма команды cp
, которую вы упомянули в вопросе, выглядит примерно так:
cp (src) (dest)
cp
в этом случае - это функция, которая возвращает замыкание, которое вызывает ваш Java-метод copy(Object src, Object dest)
.Примерно так:
def cp(src) {
return { dest ->
copy(src, dest)
}
}
Если вы хотите избавиться от скобок и принять дополнительное ключевое слово, вы можете получить что-то вроде этого:
copy src to dest
, что эквивалентно:
copy(src).to(dest)
copy
метод может быть реализован как:
def copy(src) {
[to: { dest ->
copy(src, dest)
}]
}
И, наконец, что не менее важно - вы можете вызвать этот метод Java как:
copy src, dest
Вы избавляетесь от скобок, но вам нужно добавить ,
, чтобы сообщить компилятору, что вы передаете два аргумента этой функции.
Пример
Ниже вы можете найти пример всех 3комбинации:
void copy(Object src, Object dest) {
println "Copying ${src} to ${dest}..."
}
def copy(src) {
[to: { dest ->
copy(src, dest)
}]
}
def cp(src) {
return { dest ->
copy(src, dest)
}
}
def src = "/tmp/test.txt"
def dest = "/tmp/test2.txt"
// Example 1
copy src to dest
// Example 2
cp (src) (dest)
// Example 3
copy src, dest
Запуск этого скрипта приводит к следующему выводу:
Copying /tmp/test.txt to /tmp/test2.txt...
Copying /tmp/test.txt to /tmp/test2.txt...
Copying /tmp/test.txt to /tmp/test2.txt...
Подробнее о возможностях Groovy DSL можно узнать здесь