Уча 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, въпреки че не изглежда двусмислено. Кога точно работи този вид трик?