На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

if для невнимательных

Есть в Groovy такая синтаксическая "фишка" как блокировка присваивания в условии оператора if().
Суть её состоит в том, что если при разборе условия в синтаксическое дерево, в вершине оказывается оператор присвоения, то такой код не проходит синтаксическую валидацию.

Проще говоря, если написать

def x=1
if (x=2) println "x=2";

то получим синтаксическую ошибку:

Discarding invalid text:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh script: 23: expecting ')', found '=' @ line 23, column 6.
if (x=2) println "x=2";
^

1 error

Но при всем при этом мы можем успешно написать

if ((x = 1)) println "Hello"
if (x++) println "Hello"
while (x=x-1) println x;

Обратите внимание на двойные скобки в первом примере - только при использовании "((" и "))" можно производить присваивание внутри Boolean-выражения.


Также обратите внимание, что такое поведение это не распостраняется на условие оператора while ().
А ноги у такой функциональности языка растут из того, что в Groovy, там где требуется true или false, происходит преобразование любого выражения/обьекта в Boolean, и дабы избежать ошибок при написании "=" вместо "==" в условиях, была добавлена такая вот языковая "рюшечка".

Аналогичная ситуация наблюдается и при использовании assert, только скобок нужно на одну меньше:
Неправильно:

def x=1
assert x=2

Правильно:

def x=1
assert (x=2)
наверх