Groovy необязательные круглые скобки и точки

Я изучаю Groovy и очень впечатлен тем, как он позволяет создавать интеллектуальный DSL, но я немного смущен правилами, когда круглые скобки и точки являются необязательными. Рассмотрим следующий код:

Integer take(Integer x) {x}
take 3 plus 4

это работает так, как ожидалось, и производит вывод 7 (при запуске в консоли), так как groovy понимает эту последнюю строку как take(3).plus(4).

теперь println take 3 plus 4 не работает, как groovy понимает, что как println(take).3(plus).4 что чушь.

каждый пример, который я вижу, показывает такие выражения сами по себе на линии, но, по-видимому,

s = take 3 plus 4

работает и сохраняет результат 7 в s. Мой вопрос в том, почему

println( take 3 plus 4 )

не работает? Очевидно, groovy будет анализировать такого рода выражения, даже если они сами по себе не находятся на линии (как показано в задании). Я бы подумал, что добавление этих скобок удалит двусмысленность из формы этого строка, которая не работает, и что она распечатает 7, Как я намеревался.

вместо groovy дает ошибку "неожиданный токен: 3". Насколько я могу судить, groovy не позволит необязательным скобкам или точкам внутри этого println, хотя это не кажется двусмысленным. Когда именно этот трюк сработает?

1 ответов


это относится к категории вложенного вызова метода, и в этом случае вы не можете опустить круглые скобки. Это вызывает неоднозначность, и результаты неожиданны, так как метод println считает, что вы передаете ему несколько параметров. Вы можете уменьшить неоднозначность, используя строку groovy в методе println.

println "${take 3 plus 4}"

Подробнее: Опустить Скобки